88 "net"
99 "os"
1010 "sync"
11+ "syscall"
1112 "time"
1213
1314 "github.com/shadowsocks/go-shadowsocks2/socks"
@@ -32,12 +33,11 @@ func tcpTun(addr, server, target string, shadow func(net.Conn) net.Conn) {
3233
3334// Listen on addr and proxy to server to reach target from getAddr.
3435func 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 )
3637 if err != nil {
3738 logf ("failed to listen on %s: %v" , addr , err )
3839 return
3940 }
40-
4141 for {
4242 c , err := l .Accept ()
4343 if err != nil {
@@ -68,7 +68,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
6868 return
6969 }
7070
71- rc , err := net . Dial ( "tcp" , server )
71+ rc , err := tcpDial ( server )
7272 if err != nil {
7373 logf ("failed to connect to server %v: %v" , server , err )
7474 return
@@ -94,7 +94,7 @@ func tcpLocal(addr, server string, shadow func(net.Conn) net.Conn, getAddr func(
9494
9595// Listen on addr for incoming connections.
9696func tcpRemote (addr string , shadow func (net.Conn ) net.Conn ) {
97- l , err := net . Listen ( "tcp" , addr )
97+ l , err := tcpListen ( addr )
9898 if err != nil {
9999 logf ("failed to listen on %s: %v" , addr , err )
100100 return
@@ -127,7 +127,7 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
127127 return
128128 }
129129
130- rc , err := net . Dial ( "tcp" , tgt .String ())
130+ rc , err := tcpDial ( tgt .String ())
131131 if err != nil {
132132 logf ("failed to connect to target: %v" , err )
133133 return
@@ -142,6 +142,23 @@ func tcpRemote(addr string, shadow func(net.Conn) net.Conn) {
142142 }
143143}
144144
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+
145162// relay copies between left and right bidirectionally
146163func relay (left , right net.Conn ) error {
147164 var err , err1 error
0 commit comments