クライアントがサーバーに接続しようとすると、クライアントとサーバーが両方とも localhost である場合、自己接続が発生する可能性があります (送信元ポートと宛先ポートがたまたま同じでした)。しかし、私の問題は、クライアントがそのポートをリッスンしていないことです。どうすれば自己接続が可能になりますか?
3 に答える
localhost のサーバーとクライアントは同じポートを使用しません。
接続済みの TCP 接続として、
サーバーへの送信元ポートは A、宛先ポートは B です。
クライアントへの送信元ポートは B で、宛先ポートは A です。
A はサーバーの bind() によって設定され、すべてのクライアントに認識されます。B は通常、clinets のカーネルによって割り当てられ、サーバーの accept() が戻るときにサーバーに認識されます。
詳細に:
tcp では、サーバーのポートは bind() によって設定されます。これにより、ポート番号、IP アドレス、またはその両方を指定できますが、TCP サーバーがカーネルに一時的なポートを選択させることはまれです。その後、サーバーが listen( ) ポートと IP アドレス。
クライアントは connect() を使用します。そのソケット アドレス構造には、サーバーの IP アドレスとポート番号が含まれている必要があります。 カーネルは、必要に応じてエフェメラル ポートとソース IP アドレスの両方を選択します。とにかく、サーバーが使用するポートにすることはできません。
つまり、同じコンピューター内のサーバーとクライアントのポートは同じではありません。
たとえば、単純な C/S プログラムがローカルホストで実行されている場合、ターミナルで netstat -t と入力すると、次のようになります。
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:41742 localhost:9877 ESTABLISHED
tcp 0 0 localhost:9877 localhost:41742 ESTABLISHED
プロットは明らかに異なります。
bind() によってローカルで使用しているサーバーと同じポートをクライアントに使用させると、bind() はエラーとして -1 を返します。