如何在Windows上的UDP套接字上获取ICMP端口不可达数据包

时间:2011-06-10 02:21:36

标签: udp winsock icmp

我有一个使用sendto()和UDP的应用程序来检查不同端口上的资源。如何使用recvfrom()获取ICMP端口不可达数据包?

我的recvfrom()是这样的:

SOCKADDR_STORAGE saFrom;
int nFromLen = sizeof( SOCKADDR_STORAGE );
nReceived = recvfrom ( Socket, Buffer, BufferSize, 0, ( struct sockaddr * ) &saFrom, (socklen_t *)&nFromLen );

当ICMP端口不可达时,nReceived = -1,WSAGetLastError()返回WSAECONNRESET(10054)。

但是由于我正在检查不同的端口,我想要一种确定哪个端口触发ICMP端口不可达消息的方法。我该如何确定? (也许我可以设置一些套接字选项?)

修改 根据Len的建议(仅使用ICMP),我尝试按套接字创建套接字(AF_INET,SOCK_RAW,IPPROTO_ICMP),然后在其上调用recvfrom()。 recvfrom()返回10022(WSAEINVAL)错误,因为套接字未绑定。我该怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

您不能,请在此处查看关于此主题的博文:http://www.lenholgate.com/blog/2007/12/bug-in-overlapped-udp-port-unreachable-errors.html

如果您使用的是XP,那么您可以SIO_UDP_CONNRESETWSAIoctl一起使用来控制是否报告ERROR_PORT_UNREACHABLE而不是WSAECONNRESET,但即使使用了{{1}},也可以在默认情况下的操作系统上,您仍然无法获得ICMP端口不可达的远程端口的地址。

我建议您在每个端口使用一个套接字,这样您就可以确定错误的来源。或直接使用ICMP。