Skip to content

Commit 80d7277

Browse files
committed
Clean up TCP code
1 parent c5ab4c6 commit 80d7277

File tree

1 file changed

+60
-64
lines changed

1 file changed

+60
-64
lines changed

tcp.go

+60-64
Original file line numberDiff line numberDiff line change
@@ -28,97 +28,93 @@ func tcpTun(addr, server, target string, ciph core.StreamConnCipher) {
2828

2929
// Listen on addr and proxy to server to reach target from getAddr.
3030
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)
3232
if err != nil {
3333
logf("failed to listen on %s: %v", addr, err)
3434
return
3535
}
3636

3737
for {
38-
conn, err := ln.Accept()
38+
c, err := l.Accept()
3939
if err != nil {
4040
logf("failed to accept: %s", err)
4141
continue
4242
}
4343

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+
}()
7774
}
7875
}
7976

8077
// Listen on addr for incoming connections.
8178
func tcpRemote(addr string, ciph core.StreamConnCipher) {
82-
ln, err := core.Listen("tcp", addr, ciph)
79+
l, err := core.Listen("tcp", addr, ciph)
8380
if err != nil {
8481
logf("failed to listen on %s: %v", addr, err)
8582
return
8683
}
8784

8885
logf("listening TCP on %s", addr)
8986
for {
90-
conn, err := ln.Accept()
87+
c, err := l.Accept()
9188
if err != nil {
92-
logf("failed to accept: %s", err)
89+
logf("failed to accept: %v", err)
9390
continue
9491
}
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()
11592

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+
}()
122118
}
123119
}
124120

0 commit comments

Comments
 (0)