Browse Source

socks5 UDP outbound reader writer

Shelikhoo 3 years ago
parent
commit
5b20d960f1
1 changed files with 33 additions and 0 deletions
  1. 33 0
      proxy/socks/protocol.go

+ 33 - 0
proxy/socks/protocol.go

@@ -3,6 +3,7 @@ package socks
 import (
 import (
 	"encoding/binary"
 	"encoding/binary"
 	"io"
 	"io"
+	gonet "net"
 
 
 	"github.com/v2fly/v2ray-core/v5/common"
 	"github.com/v2fly/v2ray-core/v5/common"
 	"github.com/v2fly/v2ray-core/v5/common/buf"
 	"github.com/v2fly/v2ray-core/v5/common/buf"
@@ -389,6 +390,23 @@ func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
 	return buf.MultiBuffer{b}, nil
 	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 {
 type UDPWriter struct {
 	request *protocol.RequestHeader
 	request *protocol.RequestHeader
 	writer  io.Writer
 	writer  io.Writer
@@ -414,6 +432,21 @@ func (w *UDPWriter) Write(b []byte) (int, error) {
 	return len(b), nil
 	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) {
 func ClientHandshake(request *protocol.RequestHeader, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) {
 	authByte := byte(authNotRequired)
 	authByte := byte(authNotRequired)
 	if request.User != nil {
 	if request.User != nil {