1

いくつかの基本的な質問があります:

1. ソケットは、プロトコル、ローカル IP、ローカル ポート、リモート IP、およびリモート ポートで表されます。このような接続がクライアントとサーバーの間に存在するとします。別のクライアントを同じローカル ポートと ipにバインドすると、バインドされましたが ( SO_REUSEADDRを使用しました)、2 番目のクライアントによる同じリモート ip とポートへの接続操作が失敗しました。したがって、3 番目のプロセスが同じソケットを共有できる方法はありません。 ?

2.ローカルポートとIPにバインドされたソケットでlisten()を呼び出すと、接続をリッスンします。クライアントが接続すると、ソケット (たとえば A) が作成されます。3 ウェイ ハンドシェイクを完了し、別のソケット (たとえば B) を開始し、ソケット A (ソース) も削除します。新しいクライアントは新しいソケット B によって処理されます。リモートIPとポートは何ですか?ソケットAはそのソケットとは異なりますか、それともリスニングソケットフォームAにリモートIPとポートを追加するだけですか?

3.そのポートとIPでリッスンするソケットがなく、そのポートとIPのすべてのソケットにSO_REUSEADDRオプションが設定されている場合、SO_REUSEADDRはポートでリッスンソケットを確立できること読みました。クライアントがポートと IP にバインドされている場合、最初のクライアントが connect() を正常に呼び出さない限り、別のクライアントは (SO_REUSEADDR が使用されていても) それにバインドできませんこの例では、そのポートと ip にはリッスン ソケットがありませんでした (これはクライアントであるため、connect() の呼び出しはありません) 。では、なぜ別のクライアントが許可されないのでしょうか?

前もって感謝します。

4

1 に答える 1

1
  1. 正解: 同じプロトコル、ローカル ポート、ローカル アドレス、リモート ポート、およびリモート アドレスで 2 つの異なるソケットを作成する方法はありません。どのパケットがどのソケットに属しているかはわかりません!

  2. リスニング ソケットには、リモート アドレスとリモート ポートがありません。このソケットに関連付けられたワイヤ上に (まだ) パケットがないため、問題ありません。実際には、すべてのソケットは、ローカルまたはリモートのアドレスまたはポートで開始されません。bind()これらのプロパティは、後で(ローカルの場合) およびconnect()/ accept()(リモートの場合) が呼び出されたときにのみ割り当てられます。

  3. connect()またはソケットで呼び出すまでlisten()は、サーバー (リッスン) とクライアント ソケットの間に違いはありません。それらは同じものです。したがって、どちらのソケットにもリモート アドレスまたはポートがない場合、2 つのソケットが同じプロトコル、ローカル アドレス、およびローカル ポートを共有することは許可されていないと言う方が正しいでしょう。

    ただし、これは実際には問題ではありません。通常bind()、クライアント ソケットで呼び出すことはないためです。これはbind()、一時的なポートへの暗黙的なconnect()時間が存在することを意味します。これらの典型的なクライアントソケットは、アドレスが関連付けられていない状態から、ローカルアドレスとリモートアドレスの両方が関連付けられた状態になり、ローカルアドレスのみを持つ状態をスキップするため、リッスンソケットと競合することはありません。

于 2012-07-12T20:21:48.537 に答える