2011-06-10 18 views
0

我有一个应用程序使用sendto()和UDP来检查不同端口上的资源。如何使用recvfrom()获取ICMP端口不可达数据包?如何在Windows上的UDP套接字上获取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端口不可达消息的方式。我如何确定? (也许我可以设置一些socket选项?)

编辑: 按照莱恩的建议(使用ICMP只),我试图通过插座(AF_INET,SOCK_RAW,IPPROTO_ICMP),然后调用recvfrom的创建一个socket()在上面。 recvfrom()返回10022(WSAEINVAL)错误,因为套接字未绑定。我应该如何解决这个问题?

回答

0

你不能,看到关于这个问题我在这里的博客文章:http://www.lenholgate.com/blog/2007/12/bug-in-overlapped-udp-port-unreachable-errors.html

如果你在XP,那么你可以使用SIO_UDP_CONNRESETWSAIoctl如果你ERROR_PORT_UNREACHABLE报道,而不是WSAECONNRESET但即使控制该设置(或者在默认情况下为OS的操作系统上),您仍然无法获取发生ICMP端口无法访问的远程端口的地址。

我建议你每个端口使用一个套接字来检查,这样你就可以确定错误来自哪里。或直接使用ICMP。

+0

谢谢。通过直接使用ICMP,你的意思是我创建一个ICMP套接字并调用recvfrom()?我尝试通过套接字(AF_INET,SOCK_RAW,IPPROTO_ICMP)创建一个套接字,然后在其上调用recvfrom()。 recvfrom()返回10022(WSAEINVAL)错误,因为套接字未绑定。我应该如何解决这个问题? – user775614 2011-06-10 13:16:18

+0

我不确定,我从来没有做过...试试这个:http://stackoverflow.com/questions/626541/listen-for-icmp-packets-in-c – 2011-06-10 17:05:57

相关问题