0

我有一个使用带有 UDP 的 sendto() 来检查不同端口上的资源的应用程序。如何使用 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) 错误,因为套接字未绑定。我应该如何解决这个问题?

4

1 回答 1

0

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

如果您使用的是 XP,那么您可以使用SIO_UDP_CONNRESETwithWSAIoctl来控制是否收到ERROR_PORT_UNREACHABLE报告,而不是WSAECONNRESET使用该设置(或在默认设置的操作系统上)您仍然无法获得 ICMP 所在的远程端口的地址端口无法访问发生。

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

于 2011-06-10T06:50:57.740 回答