TCP で bind() が使用されるのはなぜですか? サーバー側でのみ使用され、クライアント側では使用されないのはなぜですか? 質問する

TCP で bind() が使用されるのはなぜですか? サーバー側でのみ使用され、クライアント側では使用されないのはなぜですか? 質問する

TCP の bind() の正確な機能を知りたいです。ローカル アドレスをソケットに「バインドする」とはどういう意味ですか? ソケットにポート番号を割り当てるのであれば、なぜクライアントで使用しないのですか? ポートはクライアント側で OS によって自動的に割り当てられることは知っていますが、これがどのように機能するかの全体像がわかりません。

bind() の後は listen() です。bind は listen() とどのように関連しているのでしょうか? listen() は bind() が実行されたことを認識しますか? もしそうなら、bind() はそれを認識するためにどのような変更を加えますか? つまり、実行が成功した場合に 0 を返すことはどのように役立つのでしょうか?

多くの定義を調べましたが、これらすべてを詳細に説明しているところは見つかりませんでした。どなたか私に説明していただけるとありがたいです。

ベストアンサー1

「ローカル」側のポート番号を割り当てます。

サーバー ソケットの場合、これが究極の方法です。まさにこれが必要なことです。たとえば、Web サーバーのポート 80 にソケットをバインドします。

ただし、クライアント ソケットの場合、ローカル アドレスとポートは通常は重要ではありません。したがって、必要ありません。サーバーがクライアントに特定のポート番号、または指定された範囲外のポート番号の使用を制限している場合は、クライアント側でもbind()使用できます。bind()

一方、listen()呼び出していないソケットでも同様にできる可能性がありますbind()(実際、私はそれについては確信がありませんが、意味はあります)。このシナリオでは、サーバー ポートはランダムになり、サーバー プロセスは別の方法でクライアントにポートを伝えます。制御接続とデータ接続がある FTP などの「二重接続」プロトコルを想像してください。データ接続がリッスンするポートは完全に任意ですが、相手側に伝える必要があります。そのため、「自動的に決定されたポート」が使用され、伝えられます。

Python の例を 1 つ挙げます。

import socket
s = socket.socket() # create your socket
s.listen(10) # call listen without bind
s.getsockname() Which random port number did we get?
# here results in ('0.0.0.0', 61372)

s2 = socket.socket() # create client socket
s2.connect(('localhost', 61372)) # connect to the one above
s3, x = s.accept() # Python specific use; s3 is our connected socket on the server side
s2.getpeername()
# gives ('127.0.0.1', 61372)
s2.getsockname()
# gives ('127.0.0.1', 54663)
s3.getsockname()
# gives ('127.0.0.1', 61372), the same as s2.getpeername(), for symmetry
s3.getpeername()
#gives ('127.0.0.1', 54663), the same as s2.getsockname(), for symmetry
#test the connection
s2.send('hello')
print s3.recv(10)

おすすめ記事