我试图通过使用netcat监听某些端口来调试OS X上Jenkins的端口分配问题,这导致了一些奇怪的结果。
在OS X 10.8.2上的终端中:
$ uname -rs
Darwin 12.2.1
$ nc -l 54321
然后在第二个终端:
$ nc -l 54321
在第三个终端中,lsof
显示两个实例都绑定到同一个端口:
$ lsof -i | grep 54321
nc 70706 chris 3u IPv4 0x55618c024692f4d1 0t0 TCP *:54321 (LISTEN)
nc 70769 chris 3u IPv4 0x55618c0232cb8661 0t0 TCP *:54321 (LISTEN)
在Linux上:
第一个终端:
$ uname -rs
Linux 3.2.0-34-generic
$ nc -l 54321
第二终端:
$ nc -l 54321
nc: Address already in use
为什么OS X也没有报告该地址已被使用?
答案 0 :(得分:7)
OS X上的二进制文件正在设置SO_REUSEPORT套接字选项,该选项允许完全重复绑定(setsockopt on OS X)。您可以在OS X上使用dtrace验证这一点。
Linux上的netcat二进制文件没有这样做,因此您会收到预期的绑定错误。同样,您可以验证使用strace。我相信SO_REUSEPORT已弃用,或者甚至不适用于较新的Linux内核。