它分配“本地”端的端口号。
对于服务器套接字,这是最终的方法——这正是所需要的:例如,将您的套接字绑定到 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)