Windows应用程序上的不规则套接字错误(10054)

ymzxtsji  于 2023-01-10  发布在  Windows
关注(0)|答案(3)|浏览(181)

我正在开发一个Windows(Microsoft Visual C++2005)应用程序,该应用程序使用在Intranet中不同主机上运行的多个进程。
进程之间使用TCP/IP进行通信。不同的进程可以在同一主机上,也可以在不同的主机上(即通信可以在同一主机内进行,也可以在不同主机之间进行)。
我们目前有一个不规则出现的bug,通讯好像工作了一段时间,然后就停止工作了,然后又工作了一段时间。
当通信不起作用时,我们会得到一个错误(显然是当一个进程试图发送数据时)。

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)正确的:一个进程已终止,因此无法访问。2在其他情况下,发送方和接收方都在运行并记录活动,但由于上述错误(错误在日志中报告)而无法通信。
我的问题。

  • SO_LINGER选项是什么意思?
  • 什么是保持活动,它如何断开连接?
  • 如何避免此问题或从中恢复?

关于最后一个问题。我们尝试的第一个解决方案(实际上,这是一个变通方案)是在错误发生时重新发送消息。不幸的是,同样的错误会反复出现一段时间(几分钟)。所以这不是一个解决方案。
目前,我们不知道是否存在软件问题或配置问题:也许我们应该在Windows注册表中检查一些东西?
一个假设是操作系统耗尽了临时端口(在连接关闭但端口由于TcpTimedWaitDelay而未释放的情况下),但通过分析此问题,我们认为应该有大量临时端口:即使进程之间的消息发送不太频繁,问题也会发生。2但是,我们仍然不能100%确定我们可以排除这种情况:临时端口是否会以某种方式丢失(???)
另一个可能有帮助的细节是,发送和接收在每个进程中在单独的线程中并发发生:在TCP IP库中是否有任何共享数据结构可能被破坏?
同样很奇怪的是,问题出现的不规律:通信正常工作了几分钟,然后不工作了几分钟,然后又工作了。
谢谢你的任何想法和建议。

    • 编辑**

感谢您的提示,确认唯一可能的解释是连接关闭错误。通过进一步分析问题,我们发现连接的服务器端进程已崩溃/已终止并已重新启动。因此,有一个新的服务器进程正在运行并监听正确的端口,但是客户端没有检测到这种情况,并且仍然试图使用旧的连接。2我们现在有一种机制来检测这种情况,并在客户端重新设置连接。

llycmphe

llycmphe1#

这个错误意味着连接被远程站点关闭了。所以你不能对你的程序做任何事情,除了接受连接被中断。

4sup72z8

4sup72z82#

最近几天我面临这个问题,发现Adobe Acrobat Reader更新是罪魁祸首。只要你从系统中完全卸载Adobe,一切都会恢复正常。

ozxc1zmp

ozxc1zmp3#

我花了很长时间调试一个10054/10053错误在s3预签名上传原来,s3服务器将拒绝预签名的s3上传的前15分钟的生命.所以-如果你调试s3检查它不是一个新的桶.如果你调试别的东西-这很可能是一个问题在服务器端,而不是客户端.

相关问题