如何在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_IMP)创建一个套接字,然后对其调用recvfrom()。由于套接字未绑定,recvfrom)返回10022(WSAEINVAL)错误。我该怎么解决?

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

如果您在XP上,则可以将SIO_UDP_CONNRESETWSAIoctl一起使用来控制是否报告ERROR_PORT_UNREACHABLE而不是WSAECONNRESET,但即使使用该设置(或在默认操作系统上),您仍然无法获得ICMP端口无法访问的远程端口的地址。

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

最新更新