sing/protocol/socks/packet_wait.go
2024-05-17 21:24:05 +08:00

48 lines
1.2 KiB
Go

package socks
import (
"github.com/sagernet/sing/common/buf"
"github.com/sagernet/sing/common/bufio"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
)
var _ N.PacketReadWaitCreator = (*AssociatePacketConn)(nil)
func (c *AssociatePacketConn) CreateReadWaiter() (N.PacketReadWaiter, bool) {
readWaiter, isReadWaiter := bufio.CreateReadWaiter(c.conn)
if !isReadWaiter {
return nil, false
}
return &AssociatePacketReadWaiter{c, readWaiter}, true
}
var _ N.PacketReadWaiter = (*AssociatePacketReadWaiter)(nil)
type AssociatePacketReadWaiter struct {
conn *AssociatePacketConn
readWaiter N.ReadWaiter
}
func (w *AssociatePacketReadWaiter) InitializeReadWaiter(options N.ReadWaitOptions) (needCopy bool) {
return w.readWaiter.InitializeReadWaiter(options)
}
func (w *AssociatePacketReadWaiter) WaitReadPacket() (buffer *buf.Buffer, destination M.Socksaddr, err error) {
buffer, err = w.readWaiter.WaitReadBuffer()
if err != nil {
return
}
if buffer.Len() < 3 {
buffer.Release()
return nil, M.Socksaddr{}, ErrInvalidPacket
}
buffer.Advance(3)
destination, err = M.SocksaddrSerializer.ReadAddrPort(buffer)
if err != nil {
buffer.Release()
return
}
w.conn.remoteAddr = destination
return
}