mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-02-20 23:47:21 -05:00
socks5 UDP outbound reader writer
This commit is contained in:
parent
c3b51710de
commit
5b20d960f1
@ -3,6 +3,7 @@ package socks
|
||||
import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
gonet "net"
|
||||
|
||||
"github.com/v2fly/v2ray-core/v5/common"
|
||||
"github.com/v2fly/v2ray-core/v5/common/buf"
|
||||
@ -389,6 +390,23 @@ func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
|
||||
return buf.MultiBuffer{b}, nil
|
||||
}
|
||||
|
||||
func (v *UDPReader) ReadFrom(p []byte) (n int, addr gonet.Addr, err error) {
|
||||
buffer := buf.New()
|
||||
_, err = buffer.ReadFrom(v.reader)
|
||||
if err != nil {
|
||||
buffer.Release()
|
||||
return 0, nil, err
|
||||
}
|
||||
req, err := DecodeUDPPacket(buffer)
|
||||
if err != nil {
|
||||
buffer.Release()
|
||||
return 0, nil, err
|
||||
}
|
||||
n = copy(p, buffer.Bytes())
|
||||
buffer.Release()
|
||||
return n, &gonet.UDPAddr{IP: req.Address.IP(), Port: int(req.Port)}, nil
|
||||
}
|
||||
|
||||
type UDPWriter struct {
|
||||
request *protocol.RequestHeader
|
||||
writer io.Writer
|
||||
@ -414,6 +432,21 @@ func (w *UDPWriter) Write(b []byte) (int, error) {
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
func (w *UDPWriter) WriteTo(payload []byte, addr gonet.Addr) (n int, err error) {
|
||||
request := *w.request
|
||||
udpAddr := addr.(*gonet.UDPAddr)
|
||||
request.Command = protocol.RequestCommandUDP
|
||||
request.Address = net.IPAddress(udpAddr.IP)
|
||||
request.Port = net.Port(udpAddr.Port)
|
||||
packet, err := EncodeUDPPacket(&request, payload)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
_, err = w.writer.Write(packet.Bytes())
|
||||
packet.Release()
|
||||
return len(payload), err
|
||||
}
|
||||
|
||||
func ClientHandshake(request *protocol.RequestHeader, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) {
|
||||
authByte := byte(authNotRequired)
|
||||
if request.User != nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user