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  }