我使用socket创建了一个套接字(AF_INET,SOCK_DGRAM,IPPROTO_UDP)。
根据this,如果我多次发送简单数据包(乘以send()和/或sendto()),我可以获得ECONNREFUSED。 ICMP应该告诉先前的数据包没有到达并且应该出现ECONNREFUSED。但它失败了,errno没有报告任何错误,send()总是返回发送的字节数。
UDP协议实际上不应该告诉数据包已发送。但是ICMP可以根据我的理解提供建议。
所以,问题是 - 为什么它没有收到ECONNREFUSED?
一切都是使用Winsock完成的。
答案 0 :(得分:1)
这可能有两个原因。
ICMP
返回ICMP
但winsock
无法正确解释它(我知道某些较旧的Unix会这样做)简而言之,您最好的选择是使用嗅探器。尝试使用wireshark,看看你是否得到了ICMP。
答案 1 :(得分:0)
INFO: Winsock Ignores ICMP Port Unreachable Control Messages
您必须通过SIO_UDP_CONNRESET
启用WSAIoctl()
控件,以便UDP套接字对ICMP故障作出反应:
WinSock Recvfrom() now returns WSAECONNRESET instead of blocking or timing out