我在服务器和客户端之间建立TCP连接,该连接在同一主机上运行。我们从服务器收集和阅读,或者在我们的案例中连续说出来源。 我们读了3个不同端口的数据。
一旦源停止发布数据或重新启动,服务器/源就无法在同一端口上再次发布数据,说端口已经绑定。给出的原因是客户端仍然在这些端口上建立了连接。
我想知道这可能是什么原因?可能存在问题,因为客户端已经在侦听这些端口并尝试一次又一次地重新连接,因为我们尝试了这种重新连接机制。当源和客户端位于不同的主机上时,我更多地寻找源端的原因作为客户端的相同代码,而不是同一个主机对我们来说非常好。
编辑: - 我在浏览各种文章时发现了这一点。
关于使用SO_LINGER在关闭时发送RST以避免TIME_WAIT状态的问题:我一直遇到路由器访问服务器(保留有罪的名字)的问题,这些服务器背靠背有问题专用于特定通道的调制解调器上的连接。他们做的是放开连接,接受另一个呼叫,尝试连接到主机上的一个众所周知的套接字,并且主机拒绝连接,因为在TIME_WAIT状态下存在涉及众所周知的套接字的连接。 (Stevens的书 TCP Illustrated, Vol 1更详细地讨论了这个问题。)为了避免连接被拒绝的问题,我必须安装一个选项来重置关闭服务器启动断开连接时的服务器。
链接到来源: - http://developerweb.net/viewtopic.php?id=2941
我想我遇到了同样的问题:'尝试连接主机上一个众所周知的套接字,主机拒绝连接'。可能的修复提示是“当服务器启动断开连接时在服务器中执行重置关闭的选项”。现在我该怎么做?
答案 0 :(得分:1)
在绑定服务器套接字之前设置SO_REUSEADDR
选项并调用listen().
编辑使用SO_LINGER
选项摆弄的建议对您的广告数据毫无价值且危险。只需使用SO_RESUSEADDR.
答案 1 :(得分:0)
在重新启动/关闭服务器之前,需要关闭绑定到该端口的套接字!
http://www.gnu.org/software/libc/manual/html_node/Closing-a-Socket.html
此外,还有一个超时时间,我认为是4分钟,所以如果你创建了一个TCP套接字并关闭它,你可能还需要等待4分钟直到它关闭。
您可以使用netstat查看系统上的所有绑定端口。如果关闭服务器,或者在连接上分叉后关闭服务器,则可能有僵尸进程绑定到某些未关闭并保持活动状态的端口,因此,您无法重新绑定到同一端口。显示一些代码。