我正在使用一个使用多个进程的Windows(Microsoft Visual C ++ 2005)应用程序 在Intranet中的不同主机上运行。
进程使用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)正确:一个进程已终止并且 因此无法到达。在其他情况下,发送方和接收方都在运行 和日志记录活动,但由于上述错误(错误,它们无法通信) 在日志中报告。)
我的问题。
关于最后一个问题。我们尝试的第一个解决方案(实际上,它是一个 解决方法)在发生错误时重新发送消息。不幸的是, 一段时间(几分钟)反复出现同样的错误。所以这不是 解决方案。
目前我们不了解我们是否有软件问题或配置 问题:也许我们应该在Windows注册表中检查一下?
一个假设是操作系统耗尽短暂的端口(如果连接是 因为TcpTimedWaitDelay而没有释放端口,但是通过分析 这个问题我们认为应该有很多:问题甚至发生 如果在进程之间没有过于频繁地发送消息。但是,我们仍然没有 100%肯定我们可以排除这个:短暂的端口会以某种方式丢失(???)
另一个可能有用的细节是每个进程都会发送和接收 同时在单独的线程中:是否有任何共享数据结构 可能损坏的TCP / IP库?
同样非常奇怪的是问题不规律地发生:沟通有效 好几分钟,然后它几分钟不起作用,然后再次起作用。
感谢您提出任何意见和建议。
修改
感谢提示确认唯一可能的解释是连接已关闭错误。通过对问题的进一步分析,我们发现连接的服务器端进程已经崩溃/已经终止并且已经重新启动。所以有一个新的服务器进程在正确的端口上运行和监听,但是客户端没有检测到这一点并且仍在尝试使用旧连接。我们现在有一种机制来检测这种情况并重置客户端的连接。
答案 0 :(得分:4)
该错误表示连接已被关闭 远程站点。所以你不能对你的程序做任何事情,除非接受连接断开。
答案 1 :(得分:1)
我最近几天遇到这个问题,发现Adobe Acrobat Reader更新是罪魁祸首。一旦从系统中完全卸载Adobe,一切都会恢复正常。