undefined

获取文件描述符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")