3

同じマシンで、TCP クライアントがポート 12345 を占有している場合、たとえば、クライアントが google.com に接続し、TCP サーバーがリスニング ポートを 12345 にバインドしようとした場合、これは許可されますか?

4

2 に答える 2

4

答えは「依存する」(OS とソケットのオプションによる) です。

SO_REUSEADDR両方のソケットを備えたLinux では、説明されている正確な状況が可能です。

$ sudo netstat -panl |grep 12300
tcp        0      0 127.0.0.1:12300         0.0.0.0:*               LISTEN      3591/nc         
tcp        0      0 127.0.0.1:12300         127.0.0.1:25            ESTABLISHED 3547/nc         
tcp        0      0 127.0.0.1:25            127.0.0.1:12300         ESTABLISHED 3548/exim4

...しかし、クライアントが最初にそこに着いたときだけです。サーバーが既にリッスンしている場合、クライアントは同じポートをバインドできません (クライアント、IIRC に自動的に割り当てられることはありません)。

Windows では、 の有無にかかわらずSO_REUSEADDRport は portであり、bind失敗します (サーバーまたはクライアントが最初に実行した場合)。

于 2013-01-26T11:03:53.800 に答える
-2

いいえ。ポートはポートです。

つまり、通常、サーバーはクライアントが指定されていないポートを要求する前に起動するため、衝突が発生することはめったにありません(つまり、クライアントがポート番号を設定することはなく、マシンは空きポートを取得します)。

また、ほとんどのサーバーには事前定義されたポートがあります。

http://www.webopedia.com/quick_ref/portnumbers.asp http://www.ietf.org/rfc/rfc1700.txt?number=1700

そして範囲:

http://www.tcpipguide.com/free/t_TCPIPApplicationAssignmentsandServerPortNumberRang-2.htm

ご覧のとおり、登録済みのポートは49151に移動し、そこから動的に使用するために予約されています。したがって、クライアントポートは通常、サービスが使用してはならない範囲49152以上から取得されます。

于 2013-01-26T10:11:49.280 に答える