c++ - 套接字重连失败

标签 c++ sockets tcp

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

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

  1. 在远程端突然终止
  2. 端口锁定

需要一些关于如何清理套接字或干净地关闭以便重新连接正确发生的建议。其他替代解决方案?

谢谢, 侯赛因

最佳答案

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

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

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

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

关于c++ - 套接字重连失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996000/

相关文章:

c# - 我应该在 TCP 传输中手动嵌入数据大小信息吗?

c++ - 递归函数中的for循环在递归结束后继续

c++ - 将指定数量的零填充到 char 数组

java - 无法从输出流读取

python - 区分多个 Websocket

java - 从java中的套接字读取时出错

c++ - 我收到错误 "LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup"

c++ - 相同的 C++ 代码有时有效,有时无效

c++ - 服务器关闭时客户端上的 boost asio 写入操作被阻止

delphi - 通过 DataSnap 的 TCP/IP 连接