1

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

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

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

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

一切都是使用 Winsock 完成的。

4

2 回答 2

1

There could be two reasons for this.

  • The target machine does not (for some reason) send the ICMP back
  • The target machines does send the ICMP back but winsock doesn't correctly interpret it (I know that certain older Unixes did this)

In short, your best bet to find out would be using a sniffer. Try wireshark and see if you get an ICMP back.

于 2011-04-23T06:29:00.300 回答
1

信息:Winsock 忽略 ICMP 端口不可达控制消息

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

WinSock Recvfrom() 现在返回 WSAECONNRESET 而不是阻塞或超时

于 2012-05-23T23:05:33.510 回答