5

CでTCPクライアント/サーバー接続を確立する方法を読んでいるときに、bind()関数について疑問がありました。

クライアント/サーバー接続はLocalIP:LocalPort、RemoteIP:RemotePortによって作成されたソケットペアを使用するため、作成したソケットをローカルIPEndPointに「バインド」するためにこの関数が必要であることを読みました。したがって、私の質問は次のとおりです。

  1. クライアントがbind()を呼び出さず、ソケットを作成した直後にconnect()を呼び出すと、カーネルは何が起こり、何をしますか(これは一般的なことです。私もクライアントプログラムで行いますが、しませんバインドする必要がない理由を理解してください)?

    ...そして何よりも..。

  2. サーバープログラムがbind()を呼び出し、LocalIPアドレスとしてINADDR_ANYを指定するのはなぜですか?この定数は、一般的なIPアドレスを指定するのに役立つことを読みました。つまり、サーバーはインターネット上のどこからでもデータを受け入れます。しかし...これはローカルIPアドレスの仕様ですか、それともクライアントがサーバーに到達できる場所を示していますか?とても混乱しています...

4

2 に答える 2

4

クライアントがbind()を呼び出さず、ソケットを作成した直後にconnect()を呼び出すと、カーネルは何が起こり、何をしますか(これは一般的なことです。私もクライアントプログラムで行いますが、しませんバインドする必要がない理由を理解してください)?

最初にソケットをIP/ポートにバインドせずにアウトバウンド接続を確立すると、カーネルはルーティングテーブルと使用可能なポートに基づいてソースIPとポートを自動的に選択します。

サーバープログラムがbind()を呼び出し、LocalIPアドレスとしてINADDR_ANYを指定するのはなぜですか?この定数は、一般的なIPアドレスを指定するのに役立つことを読みました。つまり、サーバーはインターネット上のどこからでもデータを受け入れます。しかし...これはローカルIPアドレスの仕様ですか、それともクライアントがサーバーに到達できる場所を示していますか?とても混乱しています...

読んだ内容は不正確です。渡されたsockaddrのIPアドレスは、サーバーがからbind()の接続を受け入れる場所を示していません。ソケットを接続する必要があるローカルIPアドレスを示します。INADDR_ANYは、マシンに接続されているすべてのIPアドレスの指定されたポートで接続をリッスンすることを示します。複数のIPアドレスを持つサーバーでは、他のソケットを他のIPの同じポートにバインドできるように、1つのIPアドレスをtoに指定すると便利なことがよくあります。ローカルホストのみのポートにバインドすると便利なこともよくあります。bind()

于 2012-05-12T16:35:10.043 に答える
4

1) 通常、サーバー ソケットを作成する場合は、Bind を呼び出すだけで済みます。クライアント ソケットを確立する必要がある場合もありますが、多くの場合、クライアント ソケットには必要ありません。特定のポートで着信接続を待ちたい場合は、それにバインドする必要があります。何らかの IP とポートに接続する場合は、バインドする必要はありません。サーバー ソケットのバインドは、TCP ポートへの排他的アクセスを取得します。アプリケーションが閉じられるか、ソケットが閉じられるまで、オンラインになってそのポートにバインドできるものは他にありません。

2) バインドするローカル コンピューター上の IP を指定しています。1 台のコンピューターが多数の IP アドレスを持つことができます。お使いのコンピューターには、有線接続とワイヤレス接続がある場合があります。それぞれがローカル ネットワーク上に独自の IP を持っています。これらの IP の 1 つに明確にバインドでき、他の IP にはバインドできません。ある IP のポート 473 (たとえば) にバインドされた 1 つのアプリケーションと、別の IP のポート 473 にバインドされたまったく別のアプリケーションを使用することもできます。INADDR_ANY を指定すると、マシンが持つすべての有効な IP にバインドされます。したがって、クライアントがどの IP を使用して取得したかは問題ではなく、機能します。

于 2012-05-12T16:22:52.253 に答える