mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-15 21:30:50 +08:00
fix UDP proxy failed
This commit is contained in:
@@ -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() {
|
||||
|
@@ -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
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user