在同一台计算机上,如果一个TCP客户端已经占用了端口12345,例如客户端已经连接到了google.com,那么当一个TCP服务器尝试绑定自己的监听端口到12345时,这是否被允许?
在同一台计算机上,如果一个TCP客户端已经占用了端口12345,例如客户端已经连接到了google.com,那么当一个TCP服务器尝试绑定自己的监听端口到12345时,这是否被允许?
SO_REUSEADDR
选项,则可能发生所描述的情况:$ sudo netstat -panl |grep 12300
tcp 0 0 127.0.0.1:12300 0.0.0.0:* LISTEN 3591/nc
tcp 0 0 127.0.0.1:12300 127.0.0.1:25 ESTABLISHED 3547/nc
tcp 0 0 127.0.0.1:25 127.0.0.1:12300 ESTABLISHED 3548/exim4
但仅当客户端先启动时才能使用。当服务器已经在监听时,该端口无法被客户端绑定(如果是客户端自动分配的话,也永远不会被自动分配,据我所知)。
在Windows上,无论是否使用SO_REUSEADDR
,端口就是端口,并且bind
失败(无论是服务器还是客户端先绑定都是如此)。
不,端口就是端口。
话虽如此:冲突很少发生,因为通常服务器在客户端请求非指定端口之前启动(即客户端从未设置端口号,他的机器会使用一个空闲端口)。
而且大多数服务器都有预定义的端口。
http://www.webopedia.com/quick_ref/portnumbers.asp http://www.ietf.org/rfc/rfc1700.txt?number=1700
还有范围:
http://www.tcpipguide.com/free/t_TCPIPApplicationAssignmentsandServerPortNumberRang-2.htm
正如您所看到的,已注册的端口从49151开始,从那里开始被保留用于动态使用。 因此,客户端端口通常来自该范围49152及更高,服务不应使用这些端口。