「ローカル」エンドのポート番号を割り当てます。
サーバーソケットの場合、これが究極の方法です。これはまさに必要なことです。たとえば、ソケットを Web サーバーのポート 80 にバインドします。
ただし、クライアント ソケットの場合、通常、ローカル アドレスとポートは重要ではありません。だからあなたはしませんbind()
。サーバーがクライアントに特定のポート番号、または特定の範囲外のポート番号を持つように制限する場合は、bind()
クライアント側でも使用できます。
一方、listen()
呼び出していないソケットでも同様に実行できる可能性がありますbind()
(実際にはそれについてはわかりませんが、それは理にかなっています)。このシナリオでは、サーバー ポートはランダムになり、サーバー プロセスはそのポートを別の手段でクライアントに通知します。制御接続とデータ接続がある、FTP などの「二重接続」プロトコルを想像してみてください。データ接続がリッスンするポートは完全に任意ですが、反対側に通信する必要があります。そこで「自動判別ポート」を使って通信します。
Python での一例:
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)