我有一个使用带有 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) 错误,因为套接字未绑定。我应该如何解决这个问题?