我有一个应用程序使用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)错误,因为套接字未绑定。我应该如何解决这个问题?
谢谢。通过直接使用ICMP,你的意思是我创建一个ICMP套接字并调用recvfrom()?我尝试通过套接字(AF_INET,SOCK_RAW,IPPROTO_ICMP)创建一个套接字,然后在其上调用recvfrom()。 recvfrom()返回10022(WSAEINVAL)错误,因为套接字未绑定。我应该如何解决这个问题? – user775614 2011-06-10 13:16:18
我不确定,我从来没有做过...试试这个:http://stackoverflow.com/questions/626541/listen-for-icmp-packets-in-c – 2011-06-10 17:05:57