“在单个 Windows PC 上使用 UDP 进行进程间通信可能会出现什么问题?”我想......并着手实现它。
但是,尽管只发送了数百个字节并且只是非常零星地发送,并且尽管 UDP 被用作无连接协议(protocol)(使用了 sendto()
函数),但我还是被随机出现的错误 10054 - “连接重置”所困扰。我觉得这很令人困惑。是吗:
我在某处读到它可能表明另一端没有打开接收端口......但这对我来说更没有意义 - UDP不是只是应该发送数据报而不关心它会发生什么吗?或者当发送到/来自同一台机器(本地主机)上的端口时是否有一些特殊情况?
最佳答案
在我的特定情况下,我有一个在 localhost 上运行的服务器,监听绑定(bind)到特定端口的 UDP 套接字。它还有一个绑定(bind)到同一端口的第二个 UDP 套接字(这在上下文中是有意义的),仅用于发送对在第一个套接字上接收到的数据包的响应。
同样在 localhost 上运行的客户端会创建一个临时套接字,向服务器发送一个数据包,等待响应,然后关闭它们的套接字。客户端的超时非常短(出于特定于应用程序的原因),如果初始尝试超时,则会重试。
有时会发生的情况是客户端向服务器发送数据包,在发送响应之前超时,然后关闭其套接字。然后,服务器将(在监听套接字上)从客户端接收数据包,并(在发送套接字上)发回响应。但是,Windows“有用”地发回一个 ICMP 响应,指出目标端口上不再有任何套接字监听。至关重要的是,这个数据包最终被传递到监听套接字,而不是发送套接字(因为它们都共享相同的端口)。在服务器上的监听套接字的下一次读取接收到 WSAECONNRESET
错误指示它发送的前一个数据包(实际上是从不同的套接字发送的)未能传递。
就我而言,解决方法就是忽略 WSAECONNRESET
错误 在监听套接字上。发生此类错误后,监听套接字继续成功接收其他数据包,而发送失败的数据包传递失败后,发送套接字继续成功发送数据包。
关于udp - Winsock 错误 10054 (WSAECONNRESET) "normal"与 UDP 到/来自本地主机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30749423/