udp - Winsock 错误 10054 (WSAECONNRESET) "normal"与 UDP 到/来自本地主机吗?

标签 udp winsock

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

但是,尽管只发送了数百个字节并且只是非常零星地发送,并且尽管 UDP 被用作无连接协议(protocol)(使用了 sendto() 函数),但我还是被随机出现的错误 10054 - “连接重置”所困扰。我觉得这很令人困惑。是吗:

  • 完全正常,意料之中,在这种情况下……这意味着什么?
  • 完全出乎意料,我可能实现了一些错误
  • 完全出乎意料,所以我应该检查有冲突的软件(例如 problems like this )
  • 别的东西?

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

    最佳答案

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

    同样在 localhost 上运行的客户端会创建一个临时套接字,向服务器发送一个数据包,等待响应,然后关闭它们的套接字。客户端的超时非常短(出于特定于应用程序的原因),如果初始尝试超时,则会重试。

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

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

    关于udp - Winsock 错误 10054 (WSAECONNRESET) "normal"与 UDP 到/来自本地主机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30749423/

    相关文章:

    node.js - 在 Node.js 中级联 Express 框架服务器 GET 调用

    opencv - 使用 OpenCV 捕获多播 UDP 视频流

    sockets - 作用于 UDP 套接字时,什么会导致 sendto() 发送的字节数少于请求的字节数?

    c - recvfrom() 总是返回零远程地址

    c# - 确定无线网状网络中邻居的 IP 地址

    c++ - 非阻塞 Connect() 上的 WSAEWOULDBLOCK 错误

    multithreading - 当我在Winsock connect函数中强制终止线程时会发生什么?

    c - 使用C、winsock(windows)在三星Tizen推送服务器中推送消息

    c++ - winsock 服务器故障排除

    c++ - LNK2019 : Unresolved external symbol