【发布时间】:2013-01-26 19:03:53
【问题描述】:
在同一台机器上,如果一个tcp客户端占用了12345端口,比如客户端连接了google.com,然后一个tcp服务器尝试将它的监听端口绑定在12345上,这样可以吗?
【问题讨论】:
标签: sockets networking tcp conflict port-number
在同一台机器上,如果一个tcp客户端占用了12345端口,比如客户端连接了google.com,然后一个tcp服务器尝试将它的监听端口绑定在12345上,这样可以吗?
【问题讨论】:
标签: sockets networking tcp conflict port-number
答案是“取决于”(取决于操作系统和套接字选项)。
在两个套接字上都有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,port 是端口 并且 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 以上范围。
【讨论】: