Winsock错误10054(WSAECONNRESET)“正常”与UDP到/来自localhost?

时间:2015-06-10 07:08:15

标签: udp winsock

“在单个Windows PC上使用UDP进行进程间通信可能会出现什么问题?”我想......然后继续实施它。

尽管只发送了几百个字节并且只是非常偶发,并且尽管UDP被用作无连接协议(sendto()函数使用),但我仍然受到随机出现的错误10054 - “连接重置”的困扰。我觉得这很混乱。是吗:

  • 完全正常,可以预料,在这种情况下......这是什么意思发生了?
  • 完全出乎意料,我可能实现了错误
  • 完全出乎意料,所以我应该检查是否有冲突的软件(例如problems like this
  • 别的什么?

我在某处读到它可能表明在另一端没有打开接收端口......但这对我来说更没意义 - 不是UDP根本不应该发送数据报而不关心会发生什么它?或者在同一台机器(localhost)上的端口发送/从某些机器上的端口发送一些特殊情况?

1 个答案:

答案 0 :(得分:0)

在我的特定情况下,我有一个在本地主机上运行的服务器,侦听绑定到特定端口的UDP套接字。它还有一个绑定到同一端口的第二个UDP套接字(在上下文中是有意义的),仅用于发送对第一个套接字上收到的数据包的响应。

也在本地主机上运行的客户端将创建一个临时套接字,将数据包发送到服务器,等待响应,然后关闭其套接字。客户端的超时非常短(由于特定于应用程序的原因),如果初始尝试超时,则重试。

有时会发生这样的情况:客户端会将数据包发送到服务器,在发送响应之前超时,然后关闭其套接字。然后,服务器将(在侦听套接字上)从客户端接收数据包,并在发送套接字上发送回响应。但是,Windows“有帮助地”发送回ICMP响应,指出不再有套接字监听目标端口。至关重要的是,此数据包最终被传递到侦听套接字,而不是发送到发送套接字(因为它们都共享同一个端口)。在服务器上侦听套接字的下一次读取中,收到一个WSAECONNRESET错误,指示它发送的前一个数据包(实际上是从其他套接字发送的)未能传递。

就我而言,解决方法只是忽略监听套接字上的WSAECONNRESET错误。发生此类错误后,侦听套接字继续成功接收其他数据包,而在无法传递数据包之后,发送套接字继续成功发送数据包。