在同一台机器上,如果一个 tcp 客户端占用了 12345 端口,例如客户端连接了 google.com,然后一个 tcp 服务器尝试将它的监听端口绑定到 12345,这是否允许?
问问题
752 次
2 回答
4
答案是“取决于”(取决于操作系统和套接字选项)。
在具有两个套接字的 LinuxSO_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
...但只有当客户首先到达那里时。当服务器已经在监听时,客户端不能绑定相同的端口(并且永远不会自动分配给客户端 IIRC)。
在 Windows 上,无论有无SO_REUSEADDR
,port 都是端口并且bind
失败(无论是服务器还是首先执行此操作的客户端)。
于 2013-01-26T11:03:53.800 回答
-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 以上范围。
于 2013-01-26T10:11:49.280 回答