获取文件描述符fd
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| l, err := net.Listen("tcp", ":9091") handleErr(err)
conn, err := l.Accept() handleErr(err)
if s, ok := conn.(*net.TCPConn); !ok { handleErr(errors.New("not tcp conn")) } else { f, err := s.File() handleErr(err)
fmt.Println(int(f.fd())) }
|
对于socket的参数
go语言会在调用 net.Listen 的时候将 socket()、bind()、listen() 这几步一次性做完,所以我们只能使用 net.ListenConfig 设置回调函数以控制中间过程。在回调函数中拿到原始的文件描述符后,我们可以调用 syscall.SetsockoptInt 设置 socket 选项,这与原始的 setsockopt 系统调用类似。
1 2 3 4 5 6 7 8 9
| cfg := net.ListenConfig{ Control: func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEADDR, 1) syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1) }) }, } tcp, err := cfg.Listen(context.Background(), "tcp", "127.0.0.1:1234")
|