【发布时间】:2015-06-10 07:08:14
【问题描述】:
“在单个 Windows PC 上使用 UDP 进行进程间通信可能会出现什么问题?”我想...并着手实施它。
但是,尽管仅发送了数百个字节并且只是非常零星地发送,并且尽管 UDP 被用作无连接协议(使用了sendto() 函数),但我还是被随机出现的错误 10054 - “连接重置”所困扰。我觉得这很令人困惑。是吗:
- 完全正常,意料之中,在这种情况下......这意味着什么?
- 完全出乎意料,我可能实现了一些错误
- 完全出乎意料,所以我应该检查有冲突的软件(例如problems like this)
- 还有别的吗?
我在某处读到它可能表明另一端没有打开接收端口......但这对我来说更没有意义 - UDP 不是简单地应该发送数据报而不关心会发生什么它?或者当发送到/来自同一台机器(本地主机)上的端口时是否有一些特殊情况?
【问题讨论】:
-
进一步调查显示,当目标没有任何监听时,Windows 可能会返回 ECONNRESET,而不是 ECONNREFUSED。
-
看来 Windows recvfrom 文档可能有答案……有待确认。
-
即使 UDP 是无连接的,也可以在后台发送 ICMP 数据包,让 UDP 发送方知道接收方何时不可用,WinSock 在内部解释这些数据包并可能导致更高级别套接字函数失败。例如,如
recvfrom()所述:“WSAECONNRESET - 远程端执行硬关闭或异常关闭重置了虚拟电路。应用程序应关闭套接字;它不再可用。在UDP-datagram socket 这个错误表明之前的发送操作导致了 ICMP Port Unreachable 消息。" ... -
... 并为
sendto()记录:“WSAECONNRESET - 远程端执行硬或异常关闭重置了虚拟电路。对于 UPD 套接字,远程主机无法传递先前发送的 UDP 数据报并以“端口不可达”ICMP 数据包进行响应。应用程序应关闭套接字,因为它不再可用。“ -
谷歌搜索这个错误给了我很多与 ECONREFUSED for UDP 相关的 gitlab / github 问题,很多人想知道在这种情况下“连接”甚至意味着什么......迟到的 ICMP 数据包是如此令人困惑“功能”添加。为什么这个概念甚至属于UDP?如果我想要一个连接的 API,我会使用 TCP 或模拟与 UDP 连接的 API。