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  }