github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgNet/kmgTfo/TfoListen_linux.go (about) 1 package kmgTfo 2 3 import ( 4 "golang.org/x/sys/unix" 5 6 "net" 7 "os" 8 9 "github.com/bronze1man/kmg/kmgNet/kmgUnix" 10 ) 11 12 //network is useless ,it will always use tcp4 13 func TfoListen(network string, listenAddr string) (listener net.Listener, err error) { 14 s, err := unix.Socket(unix.AF_INET, unix.SOCK_STREAM|unix.SOCK_NONBLOCK|unix.SOCK_CLOEXEC, 0) 15 if err != nil { 16 return nil, err 17 } 18 defer unix.Close(s) 19 err = unix.SetsockoptInt(s, unix.SOL_TCP, 23, 10) 20 if err != nil { 21 return nil, err 22 } 23 err = unix.SetsockoptInt(s, unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) 24 if err != nil { 25 return nil, err 26 } 27 sa, err := kmgUnix.IPv4TcpAddrToUnixSocksAddr(listenAddr) 28 if err != nil { 29 return nil, err 30 } 31 err = unix.Bind(s, sa) 32 if err != nil { 33 return nil, err 34 } 35 err = unix.Listen(s, 10) 36 if err != nil { 37 return nil, err 38 } 39 f := os.NewFile(uintptr(s), "TFOListen") 40 defer f.Close() 41 return net.FileListener(f) 42 }