github.com/sagernet/sing@v0.2.6/common/bufio/deadline/packet_conn.go (about) 1 package deadline 2 3 import ( 4 "net" 5 "time" 6 7 "github.com/sagernet/sing/common/buf" 8 M "github.com/sagernet/sing/common/metadata" 9 N "github.com/sagernet/sing/common/network" 10 ) 11 12 type PacketConn struct { 13 N.NetPacketConn 14 reader PacketReader 15 } 16 17 func NewPacketConn(conn N.NetPacketConn) *PacketConn { 18 if deadlineConn, isDeadline := conn.(*PacketConn); isDeadline { 19 return deadlineConn 20 } 21 return &PacketConn{NetPacketConn: conn, reader: NewPacketReader(conn)} 22 } 23 24 func NewFallbackPacketConn(conn N.NetPacketConn) *PacketConn { 25 if deadlineConn, isDeadline := conn.(*PacketConn); isDeadline { 26 return deadlineConn 27 } 28 return &PacketConn{NetPacketConn: conn, reader: NewFallbackPacketReader(conn)} 29 } 30 31 func (c *PacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { 32 return c.reader.ReadFrom(p) 33 } 34 35 func (c *PacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr, err error) { 36 return c.reader.ReadPacket(buffer) 37 } 38 39 func (c *PacketConn) SetReadDeadline(t time.Time) error { 40 return c.reader.SetReadDeadline(t) 41 } 42 43 func (c *PacketConn) ReaderReplaceable() bool { 44 return c.reader.ReaderReplaceable() 45 } 46 47 func (c *PacketConn) WriterReplaceable() bool { 48 return true 49 } 50 51 func (c *PacketConn) Upstream() any { 52 return c.NetPacketConn 53 } 54 55 func (c *PacketConn) NeedAdditionalReadDeadline() bool { 56 return false 57 }