【发布时间】:2016-03-15 03:02:37
【问题描述】:
我正在开发一个使用多个进程的 Windows (Microsoft Visual C++ 2005) 应用程序 在内网的不同主机上运行。
进程之间使用 TCP/IP 进行通信。不同的进程可以在 同一主机或不同主机(即通信可以在同一主机内 主机或不同主机之间)。
我们目前有一个不规则出现的错误。沟通似乎有效 一段时间,然后它停止工作。然后它再次工作了一段时间。
当通信不工作时,我们得到一个错误(显然是在一个进程 正在尝试发送数据)。调用如下所示:
send(socket, (char *) data, (int) data_size, 0);
通过检查我们得到的错误代码
WSAGetLastError()
我们看到这是一个错误 10054。这是我在 Microsoft 文档中找到的 (见here):
WSAECONNRESET
10054
Connection reset by peer.
An existing connection was forcibly closed by the remote host. This normally
results if the peer application on the remote host is suddenly stopped, the
host is rebooted, the host or remote network interface is disabled, or the
remote host uses a hard close (see setsockopt for more information on the
SO_LINGER option on the remote socket). This error may also result if a
connection was broken due to keep-alive activity detecting a failure while
one or more operations are in progress. Operations that were in progress
fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
因此,据我了解,连接被接收过程中断。 在某些情况下,此错误是(AFAIK)正确的:一个进程已终止并且 因此无法到达。在其他情况下,发送方和接收方都在运行 和记录活动,但由于上述错误(错误 在日志中报告)。
我的问题。
- SO_LINGER 选项是什么意思?
- 什么是保持活动状态,它如何中断连接?
- 如何避免此问题或从中恢复?
关于最后一个问题。我们尝试的第一个解决方案(实际上,它是 解决方法)正在重新发送错误发生时的消息。不幸的是, 一段时间(几分钟)一遍又一遍地发生相同的错误。所以这不是 一个解决方案。
目前我们不知道是软件问题还是配置问题 问题:也许我们应该在 Windows 注册表中检查一些东西?
一个假设是操作系统耗尽了临时端口(如果连接是 关闭但端口由于 TcpTimedWaitDelay 未释放),但通过分析 这个问题我们认为应该有很多:即使出现问题 如果消息在进程之间发送的频率不高。然而,我们仍然不是 100% 确定我们可以排除这一点:临时端口会以某种方式丢失(???)
另一个可能有帮助的细节是发送和接收发生在每个进程中 同时在不同的线程中:在线程中是否有任何共享数据结构 可能损坏的 TCP/IP 库?
同样很奇怪的是,问题出现不规律:通信正常 正常几分钟,然后几分钟不工作,然后又工作了。
感谢您的任何想法和建议。
编辑
感谢您确认唯一可能的解释是连接关闭错误的提示。通过对问题的进一步分析,我们发现连接的服务器端进程已崩溃/已终止并已重新启动。因此,有一个新的服务器进程正在运行并在在正确的端口上侦听,但客户端没有检测到这一点,并且仍在尝试使用旧连接。我们现在有了一种机制来检测这种情况并在客户端重置连接。
【问题讨论】:
-
嗨 Giargio,我在 C# 中遇到了 RDP 连接 (3389) 的相同问题。但是连接断开是 50 秒。
标签: windows sockets visual-c++ tcp-ip