0

私は自分のsockteプログラミングの知識を磨いていて、疑問に出くわしました。

まず、ソケットについての私の理解を説明しましょう。

  1. ソケットバインディングは、ソケットをポートに関連付けます。
  2. ソケットバインディングは、カーネルが着信パケットの転送先となるプロセスを識別するのに役立ちます。

コネクション型通信ソケットの確立は以下のとおりです

  • サーバー側でsocket()-> bind()-> listen()-> accept()....。
  • クライアント側はsocket()->connect->.....です。

私の質問は、クライアントがソケットにバインドする必要がない理由です。クライアントの場合、リクエストを送信する場合は、ソケットへの応答を取得する必要があり、カーネルはそれをプロセスに転送する必要があります。これらのことを行うには、バインディングは必要ありません。そうでない場合、カーネルは応答の送信先をどのように理解するかを理解します。パケット?また、コネクションレス型のクライアント呼び出しバインドソケットですが、なぜここで必要なのですか?

4

3 に答える 3

0

私の質問は、クライアントがソケットにバインドする必要がない理由です。

connect()ソケットを自分でバインドしていない場合、を呼び出すとカーネルが自動的にバインドを行うためです。

また、コネクションレス クライアントでは、バインド ソケットを呼び出します。なぜここで必要なのですか?

それ以外の場合、ソケットは IP アドレス: ポートにバインドされていないため、何も送受信できません。外の世界への道はありません。

于 2016-04-19T23:22:58.137 に答える
-1

常に最初にソケットを開きます。これは、カーネルを通るパスです。connectTCPの呼び出しは、ソケットが作成された後に発生します。

TCP クライアントと UDP クライアントを比較してください。

TCP

s  = socket(options....)
connect(s)
send(s, data)

UDP

s = socket(options....)
send(s, data)
于 2012-10-12T20:27:27.317 に答える
-1

bind("0.0.0.0", 0) (all interfaces, any port) is implicit if you call connect(...) or listen(...) without an explicit bind(...).

All sockets must be bound to a local port even when connectionless so that bi-directional communication is possible (even if you're not going to do so).

于 2012-10-12T21:01:04.130 に答える