github.com/chwjbn/xclash@v0.2.0/transport/ssr/protocol/packet.go (about) 1 package protocol 2 3 import ( 4 "net" 5 6 "github.com/chwjbn/xclash/common/pool" 7 ) 8 9 type PacketConn struct { 10 net.PacketConn 11 Protocol 12 } 13 14 func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { 15 buf := pool.GetBuffer() 16 defer pool.PutBuffer(buf) 17 err := c.EncodePacket(buf, b) 18 if err != nil { 19 return 0, err 20 } 21 _, err = c.PacketConn.WriteTo(buf.Bytes(), addr) 22 return len(b), err 23 } 24 25 func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { 26 n, addr, err := c.PacketConn.ReadFrom(b) 27 if err != nil { 28 return n, addr, err 29 } 30 decoded, err := c.DecodePacket(b[:n]) 31 if err != nil { 32 return n, addr, err 33 } 34 copy(b, decoded) 35 return len(decoded), addr, nil 36 }