Gio*_*gio 5 sockets windows visual-c++ tcp-ip
我正在使用Windows(Microsoft Visual C++ 2005)应用程序,该应用程序使用在Intranet中的不同主机上运行的多个进程.
进程使用TCP/IP相互通信.不同的进程可以在同一主机上或不同的主机上(即,通信可以在同一主机内或在不同主机之间).
我们目前有一个不规则的错误.通信似乎工作了一段时间,然后它停止工作.然后它再次工作一段时间.
当通信不起作用时,我们会收到错误(显然是在进程尝试发送数据时).电话看起来像这样:
send(socket, (char *) data, (int) data_size, 0);
Run Code Online (Sandbox Code Playgroud)
通过检查我们得到的错误代码
WSAGetLastError()
Run Code Online (Sandbox Code Playgroud)
我们看到它是一个错误10054.这是我在Microsoft文档中找到的(见这里):
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.
Run Code Online (Sandbox Code Playgroud)
所以,据我所知,连接被接收过程中断了.在某些情况下,此错误(AFAIK)正确:一个进程已终止,因此无法访问.在其他情况下,发送方和接收方都在运行并记录活动,但由于上述错误它们无法通信(错误在日志中报告).
我的问题.
关于最后一个问题.我们尝试的第一个解决方案(实际上,它是一种解决方法)是在发生错误时重新发送消息.不幸的是,同样的错误一次又一次地发生(几分钟).所以这不是一个解决方案.
目前我们不明白我们是否有软件问题或配置问题:也许我们应该检查一下Windows注册表中的内容?
一个假设是操作系统用完了临时端口(如果连接关闭但端口因TcpTimedWaitDelay而未释放),但通过分析这个问题,我们认为应该有很多这样的问题:即使消息不是,也会出现问题在进程之间发送太频繁.但是,我们仍然不能100%确定我们可以排除这个:短暂的端口会以某种方式丢失(???)
可能有帮助的另一个细节是在每个进程中在不同的线程中同时发送和接收:TCP/IP库中是否存在可能被损坏的共享数据结构?
同样非常奇怪的是,问题不规则地发生:通信工作正常几分钟,然后几分钟不工作,然后再次工作.
感谢您提出任何意见和建议.
编辑
感谢提示确认唯一可能的解释是连接关闭错误.通过对问题的进一步分析,我们发现连接的服务器端进程已经崩溃/已经终止并且已经重新启动.因此就出现了一个新的服务器进程运行,并侦听正确的端口上,但并没有发现这一点,并仍试图使用旧连接的客户端.我们现在有一种机制来检测这种情况并重置客户端的连接.
归档时间: |
|
查看次数: |
30814 次 |
最近记录: |