如何在Windows的UDP套接字上获取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)错误,因为未绑定套接字。我该如何解决?     
已邀请:
        您不能,在这里看到我关于此主题的博客文章:http://www.lenholgate.com/blog/2007/12/bug-in-overlapped-udp-port-unreachable-errors.html 如果您使用的是XP,则可以使用
SIO_UDP_CONNRESET
WSAIoctl
来控制是否得到get3ѭ而不是
WSAECONNRESET
,但是即使设置了该值(或在默认设置的OS上),您仍然不会得到ICMP端口不可达的远端端口。 我建议您在检查的每个端口上使用一个套接字,这样就可以确定错误的来源。或直接使用ICMP。     

要回复问题请先登录注册