套接字重新连接失败

时间:2010-10-22 10:39:16

标签: c++ sockets tcp

系统背景: 它基本上是一个客户端/服务器应用Server是一个嵌入式设备,Client是一个用C ++开发的Windows应用程序。

问题:在大约一周的运行时间之后,客户端/服务器之间的通信中断,
因此,服务器无法连接回客户端,需要重新启动才能恢复。看起来System正在遇到Socket重新连接问题。此外,网络有时会出现间歇性故障。

  1. 远端突然终止
  2. 端口锁定
  3. 想要了解如何清理套接字或干净地关闭以便正确重新连接的建议。其他替代解决方案?

    谢谢, 侯赛因

3 个答案:

答案 0 :(得分:2)

这听起来并不像你能够轻松编写一个压力测试应用程序,以便更快地在带外重现,这是我通常会建议的。一个实用的解决方案可能是在您认为系统最不忙或出现问题时定期重启服务器和客户端。这听起来像是作弊,但我参与的许多生产系统采用这种方法来最大化系统正常运行时间。

我首选的解决方案是抽象服务器和客户端套接字代码(希望您的设计允许在没有太多工作的情况下完成)并使用它来实现客户端和服务器测试应用程序,这些应用程序可用于仅对压力测试套接字代码通过在很短的时间内模拟大量正常套接字流量 - 这有助于识别可能导致问题的时序窗口和边缘情况,并可能加快获取可调试repro的过程 - 您可以模拟网络错误通过定期在客户端或服务器上删除套接字来测试代码。

采取战略前沿的另一个步骤是确保您在客户端和服务器端的套接字处理程序中具有良好的诊断功能。跟踪套接字打开和关闭,特别关注套接字错误并重新连接路径,因为您知道网络不可靠。确保日志按时间顺序输出。像这样简单的事情可能会很快向您显示哪些错误或条件会触发您的问题。您可以使用我上面提到的测试应用程序快速确保日志正确和完整。

您可能想要检查的一件事是,您不会因缺乏重用地址的能力而受到打击。有时当套接字关闭时,它不能立即重新用于重新连接尝试,因为在一端或另一端仍有剩余活动。您可以通过在套接字上试用SO_REUSEADDR和SO_LINGER来解决这个问题(基于我的Windows / Winsock体验)。但是,我的第一个重点是确保客户端和服务器上的套接字代码正确处理所有错误和主线情况,然后再担心这一点。

答案 1 :(得分:1)

一个常见问题是,当连接断开时,操作系统会在TIME_WAIT状态下保持打开状态。如果要重新启动服务器套接字,它将无法直接重新打开相同的端口,因为它仍然存在于操作系统中。 为避免这种情况,您需要设置参数SO_REUSEADDR,以便操作系统允许您在服务器套接字处于TIME_WAIT状态时重用该端口。

示例:

int optval=1;
// set SO_REUSEADDR on a socket to true (1):
setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);

答案 2 :(得分:0)

我遇到类似加密连接的事情。我相信我的情况是因为客户端在不到4分钟的FIN_WAIT期间丢弃了连接并重新连接。初始连接被回收(通过操作系统),服务器看不到丢失。当客户端失去连接时,SSL身份验证将丢失,因此客户端会尝试重新进行身份验证。这是在服务器认为会话中间的情况。然后服务器挂起在客户端上。我认为服务器ssl代码认为这是一个处于中间攻击的人,或者只是感到困惑并关闭连接。