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