mirror of
https://github.com/SagerNet/sing.git
synced 2025-04-03 20:07:38 +03:00
48 lines
1.2 KiB
Go
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
|
|
}
|