2

クライアントがサーバーに接続しようとすると、クライアントとサーバーが両方とも localhost である場合、自己接続が発生する可能性があります (送信元ポートと宛先ポートがたまたま同じでした)。しかし、私の問題は、クライアントがそのポートをリッスンしていないことです。どうすれば自己接続が可能になりますか?

4

3 に答える 3

1

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 を返します。

于 2013-05-27T09:08:48.453 に答える