8
8
"net"
9
9
"os"
10
10
"sync"
11
+ "syscall"
11
12
"time"
12
13
13
14
"github.com/shadowsocks/go-shadowsocks2/socks"
@@ -32,12 +33,11 @@ func tcpTun(addr, server, target string, shadow func(net.Conn) net.Conn) {
32
33
33
34
// Listen on addr and proxy to server to reach target from getAddr.
34
35
func tcpLocal (addr , server string , shadow func (net.Conn ) net.Conn , getAddr func (net.Conn ) (socks.Addr , error )) {
35
- l , err := net . Listen ( "tcp" , addr )
36
+ l , err := tcpListen ( addr )
36
37
if err != nil {
37
38
logf ("failed to listen on %s: %v" , addr , err )
38
39
return
39
40
}
40
-
41
41
for {
42
42
c , err := l .Accept ()
43
43
if err != nil {
@@ -68,7 +68,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
68
68
return
69
69
}
70
70
71
- rc , err := net . Dial ( "tcp" , server )
71
+ rc , err := tcpDial ( server )
72
72
if err != nil {
73
73
logf ("failed to connect to server %v: %v" , server , err )
74
74
return
@@ -94,7 +94,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
94
94
95
95
// Listen on addr for incoming connections.
96
96
func tcpRemote (addr string , shadow func (net.Conn ) net.Conn ) {
97
- l , err := net . Listen ( "tcp" , addr )
97
+ l , err := tcpListen ( addr )
98
98
if err != nil {
99
99
logf ("failed to listen on %s: %v" , addr , err )
100
100
return
@@ -127,7 +127,7 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
127
127
return
128
128
}
129
129
130
- rc , err := net . Dial ( "tcp" , tgt .String ())
130
+ rc , err := tcpDial ( tgt .String ())
131
131
if err != nil {
132
132
logf ("failed to connect to target: %v" , err )
133
133
return
@@ -142,6 +142,23 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
142
142
}
143
143
}
144
144
145
+ // tcpDial opens a connecion socket
146
+ func tcpDial (addr string ) (net.Conn , error ) {
147
+ d := net.Dialer {
148
+ Control : func (network , address string , c syscall.RawConn ) error {
149
+ var sockErr error
150
+ if err := c .Control (func (fd uintptr ) { sockErr = tcpSetDialOpts (fd ) }); err != nil {
151
+ return err
152
+ }
153
+ if sockErr != nil {
154
+ logf ("failed to set up dialing socket: %s" , sockErr )
155
+ }
156
+ return nil
157
+ },
158
+ }
159
+ return d .Dial ("tcp" , addr )
160
+ }
161
+
145
162
// relay copies between left and right bidirectionally
146
163
func relay (left , right net.Conn ) error {
147
164
var err , err1 error
0 commit comments