10

私は、netcatで特定のポートをリッスンすることにより、OS X上のJenkinsでポート割り当ての問題をデバッグしようとしていましたが、これは奇妙な結果につながりました。


OS X 10.8.2の端末の場合:

$ uname -rs
Darwin 12.2.1

$ nc -l 54321

次に、2番目のターミナルで:

$ nc -l 54321

そして、3番目の端末で、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

2番目のターミナル:

$ nc -l 54321
nc: Address already in use

アドレスがすでに使用されていることをOSXが報告しないのはなぜですか?

4

1 に答える 1

9

OS Xのバイナリは、SO_REUSEPORTソケットオプションを設定しています。これにより、バインディングを完全に複製できます(OS Xのsetsockopt)。これは、OSXでdtraceを使用して確認できます。

Linuxのnetcatバイナリはこれを行わないため、期待どおりにバインドエラーが発生します。繰り返しますが、straceを使用してそれを確認できます。SO_REUSEPORTは非推奨であるか、新しいLinuxカーネルでは使用できないと思います。

于 2012-12-06T01:57:33.250 に答える