【问题标题】:UDP socket fail to receive ECONNREFUSEDUDP 套接字无法接收 ECONNREFUSED
【发布时间】:2011-08-11 09:05:15
【问题描述】:

我使用 socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) 创建了一个套接字。

根据this,如果我多次发送简单数据包(乘以 send() 和/或 sendto()),我可以得到 ECONNREFUSED。 ICMP 应该告诉之前的数据包没有到达并且 ECONNREFUSED 应该出现。但它失败了,errno 不报告任何错误,并且 send() 总是返回发送的字节数。

UDP 协议实际上不应该告诉数据包已发送。但 ICMP 可以提供我所理解的建议。

那么,问题是——为什么它没有收到 ECONNREFUSED?

一切都是使用 Winsock 完成的。

【问题讨论】:

  • 你在你的 UDP 套接字上调用了 connect() 吗?

标签: c udp winsock icmp


【解决方案1】:

INFO: Winsock Ignores ICMP Port Unreachable Control Messages

您必须通过WSAIoctl() 启用SIO_UDP_CONNRESET 控件,以便UDP 套接字对ICMP 故障作出反应:

WinSock Recvfrom() now returns WSAECONNRESET instead of blocking or timing out

【讨论】:

    【解决方案2】:

    这可能有两个原因。

    • 目标机器没有(由于某种原因)发回ICMP
    • 目标机器确实发回ICMP,但winsock 没有正确解释它(我知道某些较旧的 Unix 会这样做)

    简而言之,最好的办法是使用嗅探器。试试wireshark,看看能不能得到ICMP。

    【讨论】:

    • 感谢您的回答。系统是winxp,本地机。 ICMP 只是假设,可能是别的东西
    猜你喜欢
    • 2017-09-04
    • 2015-11-26
    • 2012-07-17
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多