fix UDP proxy failed

This commit is contained in:
Jason
2019-08-14 13:54:35 +08:00
parent fa311d6599
commit 5c8160ab42
3 changed files with 20 additions and 15 deletions

View File

@@ -80,7 +80,7 @@ func init() {
// Proxy
args.ProxyServer = flag.String("proxyServer", "", "Proxy server address")
args.UdpTimeout = flag.Duration("udpTimeout", 60*time.Second, "UDP session timeout")
args.UdpTimeout = flag.Duration("udpTimeout", 30*time.Second, "UDP session timeout")
}
func main() {

View File

@@ -16,7 +16,12 @@ func Dial(proxy, target string) (net.Conn, error) {
return nil, fmt.Errorf("%s connect error", proxy)
}
if _, err := ClientHandshake(c, ParseAddr(target), CmdConnect); err != nil {
targetAddr := ParseAddr(target)
if targetAddr == nil {
return nil, fmt.Errorf("target address parse error")
}
if _, err := ClientHandshake(c, targetAddr, CmdConnect); err != nil {
return nil, err
}
return c, nil
@@ -39,7 +44,13 @@ func DialUDP(proxy, target string) (_ net.PacketConn, _ net.Addr, err error) {
}
}()
bindAddr, err := ClientHandshake(c, ParseAddr(target), CmdUDPAssociate)
targetAddr := ParseAddr(target)
if targetAddr == nil {
err = fmt.Errorf("target address parse error")
return
}
bindAddr, err := ClientHandshake(c, targetAddr, CmdUDPAssociate)
if err != nil {
err = fmt.Errorf("%v client hanshake error", err)
return
@@ -50,11 +61,6 @@ func DialUDP(proxy, target string) (_ net.PacketConn, _ net.Addr, err error) {
return
}
targetAddr, err := net.ResolveUDPAddr("udp", target)
if err != nil {
return
}
pc, err := net.ListenPacket("udp", "")
if err != nil {
return
@@ -74,11 +80,11 @@ func DialUDP(proxy, target string) (_ net.PacketConn, _ net.Addr, err error) {
type socksUDPConn struct {
net.PacketConn
tcpConn net.Conn
targetAddr net.Addr
targetAddr Addr
}
func (c *socksUDPConn) WriteTo(b []byte, addr net.Addr) (n int, err error) {
packet, err := EncodeUDPPacket(c.targetAddr.String(), b)
packet, err := EncodeUDPPacket(c.targetAddr, b)
if err != nil {
return
}

View File

@@ -235,12 +235,11 @@ func DecodeUDPPacket(packet []byte) (addr Addr, payload []byte, err error) {
return
}
func EncodeUDPPacket(addr string, payload []byte) (packet []byte, err error) {
rAddr := ParseAddr(addr)
if rAddr == nil {
err = errors.New("cannot parse addr")
func EncodeUDPPacket(addr Addr, payload []byte) (packet []byte, err error) {
if addr == nil {
err = errors.New("address is invalid")
return
}
packet = bytes.Join([][]byte{{0, 0, 0}, rAddr, payload}, []byte{})
packet = bytes.Join([][]byte{{0, 0, 0}, addr, payload}, []byte{})
return
}