3

在同一台机器上,如果一个 tcp 客户端占用了 12345 端口,例如客户端连接了 google.com,然后一个 tcp 服务器尝试将它的监听端口绑定到 12345,这是否允许?

4

2 回答 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_REUSEADDRport 都是端口并且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 回答