2012-12-05 10 views
7

私はJenkinsのOS Xでポート割り当ての問題をデバッグしようとしていましたが、Netcatで特定のポートをリッスンすると奇妙な結果に繋がりました。OS Xが同じTCPポートで2回リッスンできるのはなぜですか?

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 

第二ターミナル:

$ nc -l 54321 
nc: Address already in use 

なぜOS Xは、アドレスがすでにあることを報告しません。つかいます?

+1

'lsof -i'出力の構文はわかりませんが、' 0x55618c024692f4d1'と '0x55618c0232cb8661'は何ですか? IPアドレスの場合は、リスナーが特定のIPアドレスにバインドされていて、「任意の」アドレスにバインドされていないためです。 – CodeCaster

+0

意味のないメモリアドレスです。彼らが持つ唯一の目的は、これらが2つの異なるソケットであることを識別することです(例えば、 'fork()'や 'dup()'の結果ではない)。 – duskwuff

+0

'lsof -i'を実行すると、そのフィールドには27個の一意の値(" DEVICE ")が与えられます。私はそれがメモリアドレスだと信じています。最後の列は、ソケットが '*'に束縛されていることを示しています。 –

答えて

6

OS X上のバイナリはSO_REUSEPORTソケットオプションを設定しています。これにより、完全に重複するバインディング(setsockopt on OS X)が可能になります。これを確認するには、OS Xのdtraceを使用します。

Linuxのnetcatバイナリではこれが行われないため、期待どおりにバインドエラーが発生します。ここでも、straceを使用していることを確認できます。私はSO_REUSEPORTが廃止されたこと、または新しいLinuxカーネルでも使用できないと信じています。

+0

情報ありがとう!これはまた、別のソフトウェアが稼動していた場合、そのポートが既に使用されていると不平を言うことを説明しています。 –

+0

情報として、SO_REUSEPORTソケットオプションがLinux 3.9に追加されました:https://lwn.net/Articles/542629/ –

関連する問題