mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-02-20 15:37:33 -05:00
Fix Socks UDP implementation
This commit is contained in:
parent
3ac8b9caa5
commit
eb94f7a51c
@ -22,6 +22,28 @@ func (request *Socks5UDPRequest) Destination() v2net.Destination {
|
||||
return v2net.NewUDPDestination(request.Address)
|
||||
}
|
||||
|
||||
func (request *Socks5UDPRequest) Bytes(buffer []byte) []byte {
|
||||
if buffer == nil {
|
||||
buffer = make([]byte, 0, 2*1024)
|
||||
}
|
||||
buffer = append(buffer, 0, 0, request.Fragment)
|
||||
switch {
|
||||
case request.Address.IsIPv4():
|
||||
buffer = append(buffer, AddrTypeIPv4)
|
||||
buffer = append(buffer, request.Address.IP()...)
|
||||
case request.Address.IsIPv6():
|
||||
buffer = append(buffer, AddrTypeIPv6)
|
||||
buffer = append(buffer, request.Address.IP()...)
|
||||
case request.Address.IsDomain():
|
||||
buffer = append(buffer, AddrTypeDomain)
|
||||
buffer = append(buffer, byte(len(request.Address.Domain())))
|
||||
buffer = append(buffer, []byte(request.Address.Domain())...)
|
||||
}
|
||||
buffer = append(buffer, request.Address.PortBytes()...)
|
||||
buffer = append(buffer, request.Data...)
|
||||
return buffer
|
||||
}
|
||||
|
||||
func ReadUDPRequest(packet []byte) (request Socks5UDPRequest, err error) {
|
||||
// packet[0] and packet[1] are reserved
|
||||
request.Fragment = packet[2]
|
||||
|
@ -54,15 +54,17 @@ func (server *SocksServer) AcceptPackets(conn *net.UDPConn) error {
|
||||
}
|
||||
|
||||
udpPacket := v2net.NewPacket(request.Destination(), request.Data, false)
|
||||
go server.handlePacket(conn, udpPacket, addr)
|
||||
go server.handlePacket(conn, udpPacket, addr, request)
|
||||
}
|
||||
}
|
||||
|
||||
func (server *SocksServer) handlePacket(conn *net.UDPConn, packet v2net.Packet, clientAddr *net.UDPAddr) {
|
||||
func (server *SocksServer) handlePacket(conn *net.UDPConn, packet v2net.Packet, clientAddr *net.UDPAddr, request protocol.Socks5UDPRequest) {
|
||||
ray := server.vPoint.DispatchToOutbound(packet)
|
||||
close(ray.InboundInput())
|
||||
|
||||
if data, ok := <-ray.InboundOutput(); ok {
|
||||
conn.WriteToUDP(data, clientAddr)
|
||||
request.Data = data
|
||||
udpMessage := request.Bytes(nil)
|
||||
nBytes, err := conn.WriteToUDP(udpMessage, clientAddr)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user