github.com/sagernet/sing@v0.2.6/common/bufio/bind.go (about) 1 package bufio 2 3 import ( 4 "net" 5 6 "github.com/sagernet/sing/common/buf" 7 M "github.com/sagernet/sing/common/metadata" 8 N "github.com/sagernet/sing/common/network" 9 ) 10 11 type BindPacketConn struct { 12 N.NetPacketConn 13 Addr net.Addr 14 } 15 16 func NewBindPacketConn(conn net.PacketConn, addr net.Addr) *BindPacketConn { 17 return &BindPacketConn{ 18 NewPacketConn(conn), 19 addr, 20 } 21 } 22 23 func (c *BindPacketConn) Read(b []byte) (n int, err error) { 24 n, _, err = c.ReadFrom(b) 25 return 26 } 27 28 func (c *BindPacketConn) Write(b []byte) (n int, err error) { 29 return c.WriteTo(b, c.Addr) 30 } 31 32 func (c *BindPacketConn) RemoteAddr() net.Addr { 33 return c.Addr 34 } 35 36 func (c *BindPacketConn) Upstream() any { 37 return c.NetPacketConn 38 } 39 40 type UnbindPacketConn struct { 41 N.ExtendedConn 42 Addr M.Socksaddr 43 } 44 45 func NewUnbindPacketConn(conn net.Conn) *UnbindPacketConn { 46 return &UnbindPacketConn{ 47 NewExtendedConn(conn), 48 M.SocksaddrFromNet(conn.RemoteAddr()), 49 } 50 } 51 52 func (c *UnbindPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { 53 n, err = c.ExtendedConn.Read(p) 54 if err == nil { 55 addr = c.Addr.UDPAddr() 56 } 57 return 58 } 59 60 func (c *UnbindPacketConn) WriteTo(p []byte, _ net.Addr) (n int, err error) { 61 return c.ExtendedConn.Write(p) 62 } 63 64 func (c *UnbindPacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) { 65 err = c.ExtendedConn.ReadBuffer(buffer) 66 if err != nil { 67 return 68 } 69 destination = c.Addr 70 return 71 } 72 73 func (c *UnbindPacketConn) WritePacket(buffer *buf.Buffer, _ M.Socksaddr) error { 74 return c.ExtendedConn.WriteBuffer(buffer) 75 } 76 77 func (c *UnbindPacketConn) Upstream() any { 78 return c.ExtendedConn 79 }