在同一台机器上,如果tcp客户端已占用端口12345,例如,客户端已连接到google.com,然后tcp服务器尝试将其侦听端口绑定到12345,这是否允许?
答案 0 :(得分:4)
答案是“它取决于”(在操作系统和套接字选项上)。
在两个套接字上都有SO_REUSEADDR
的Linux上,可能会出现所描述的确切情况:
$ 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
...但只有当客户首先到达那里时。当服务器已经在侦听时,同一个端口不能被客户端绑定(并且不会自动分配给客户端,IIRC)。
在Windows上,无论是否有SO_REUSEADDR
,端口都是端口而bind
失败(无论是服务器还是首先执行此操作的客户端)。
答案 1 :(得分:-2)
没有。港口是港口。
这说:很少有冲突,因为通常服务器在客户端请求非指定端口之前启动(即客户端从不设置端口号,他的机器需要一个免费的端口号。)
大多数服务器都有预定义的端口。
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向上的范围,服务不应该使用。