@@ -28,97 +28,93 @@ func tcpTun(addr, server, target string, ciph core.StreamConnCipher) {
28
28
29
29
// Listen on addr and proxy to server to reach target from getAddr.
30
30
func tcpLocal (addr , server string , ciph core.StreamConnCipher , getAddr func (net.Conn ) (socks.Addr , error )) {
31
- ln , err := net .Listen ("tcp" , addr )
31
+ l , err := net .Listen ("tcp" , addr )
32
32
if err != nil {
33
33
logf ("failed to listen on %s: %v" , addr , err )
34
34
return
35
35
}
36
36
37
37
for {
38
- conn , err := ln .Accept ()
38
+ c , err := l .Accept ()
39
39
if err != nil {
40
40
logf ("failed to accept: %s" , err )
41
41
continue
42
42
}
43
43
44
- tgt , err := getAddr (conn )
45
- if err != nil {
46
- logf ("failed to get target address: %v" , err )
47
- continue
48
- }
49
-
50
- go tcpLocalHandle (conn , server , tgt , ciph )
51
- }
52
- }
53
-
54
- func tcpLocalHandle (c net.Conn , server string , target socks.Addr , ciph core.StreamConnCipher ) {
55
- logf ("proxy %s <-> %s <-> %s" , c .RemoteAddr (), server , target )
56
-
57
- defer c .Close ()
58
-
59
- sc , err := core .Dial ("tcp" , server , ciph )
60
- if err != nil {
61
- logf ("failed to connect to server %v: %v" , server , err )
62
- return
63
- }
64
- defer sc .Close ()
65
-
66
- if _ , err = sc .Write (target ); err != nil {
67
- logf ("failed to send target address: %v" , err )
68
- return
69
- }
70
-
71
- _ , _ , err = relay (sc , c )
72
- if err != nil {
73
- if err , ok := err .(net.Error ); ok && err .Timeout () {
74
- return // ignore i/o timeout
75
- }
76
- logf ("relay error: %v" , err )
44
+ go func () {
45
+ defer c .Close ()
46
+
47
+ tgt , err := getAddr (c )
48
+ if err != nil {
49
+ logf ("failed to get target address: %v" , err )
50
+ return
51
+ }
52
+
53
+ rc , err := core .Dial ("tcp" , server , ciph )
54
+ if err != nil {
55
+ logf ("failed to connect to server %v: %v" , server , err )
56
+ return
57
+ }
58
+ defer rc .Close ()
59
+
60
+ if _ , err = rc .Write (tgt ); err != nil {
61
+ logf ("failed to send target address: %v" , err )
62
+ return
63
+ }
64
+
65
+ logf ("proxy %s <-> %s <-> %s" , c .RemoteAddr (), server , tgt )
66
+ _ , _ , err = relay (rc , c )
67
+ if err != nil {
68
+ if err , ok := err .(net.Error ); ok && err .Timeout () {
69
+ return // ignore i/o timeout
70
+ }
71
+ logf ("relay error: %v" , err )
72
+ }
73
+ }()
77
74
}
78
75
}
79
76
80
77
// Listen on addr for incoming connections.
81
78
func tcpRemote (addr string , ciph core.StreamConnCipher ) {
82
- ln , err := core .Listen ("tcp" , addr , ciph )
79
+ l , err := core .Listen ("tcp" , addr , ciph )
83
80
if err != nil {
84
81
logf ("failed to listen on %s: %v" , addr , err )
85
82
return
86
83
}
87
84
88
85
logf ("listening TCP on %s" , addr )
89
86
for {
90
- conn , err := ln .Accept ()
87
+ c , err := l .Accept ()
91
88
if err != nil {
92
- logf ("failed to accept: %s " , err )
89
+ logf ("failed to accept: %v " , err )
93
90
continue
94
91
}
95
- go tcpRemoteHandle (conn )
96
- }
97
- }
98
-
99
- func tcpRemoteHandle (c net.Conn ) {
100
- defer c .Close ()
101
-
102
- addr , err := socks .ReadAddr (c )
103
- if err != nil {
104
- logf ("failed to read address: %v" , err )
105
- return
106
- }
107
- logf ("proxy %s <-> %s" , c .RemoteAddr (), addr )
108
-
109
- conn , err := net .Dial ("tcp" , addr .String ())
110
- if err != nil {
111
- logf ("failed to connect to target: %s" , err )
112
- return
113
- }
114
- defer conn .Close ()
115
92
116
- _ , _ , err = relay (c , conn )
117
- if err != nil {
118
- if err , ok := err .(net.Error ); ok && err .Timeout () {
119
- return // ignore i/o timeout
120
- }
121
- logf ("relay error: %v" , err )
93
+ go func () {
94
+ defer c .Close ()
95
+
96
+ tgt , err := socks .ReadAddr (c )
97
+ if err != nil {
98
+ logf ("failed to get target address: %v" , err )
99
+ return
100
+ }
101
+
102
+ rc , err := net .Dial ("tcp" , tgt .String ())
103
+ if err != nil {
104
+ logf ("failed to connect to target: %v" , err )
105
+ return
106
+ }
107
+ defer rc .Close ()
108
+
109
+ logf ("proxy %s <-> %s" , c .RemoteAddr (), tgt )
110
+ _ , _ , err = relay (c , rc )
111
+ if err != nil {
112
+ if err , ok := err .(net.Error ); ok && err .Timeout () {
113
+ return // ignore i/o timeout
114
+ }
115
+ logf ("relay error: %v" , err )
116
+ }
117
+ }()
122
118
}
123
119
}
124
120
0 commit comments