【问题标题】:How to get ICMP port unreachable packet on UDP socket on Windows如何在 Windows 上的 UDP 套接字上获取 ICMP 端口不可达数据包
【发布时间】:2011-06-10 23:34:33
【问题描述】:

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

【问题讨论】:

    标签: udp winsock icmp


    【解决方案1】:

    您不能,请在此处查看我关于该主题的博文: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。

    【讨论】:

    • 谢谢。直接使用ICMP,你的意思是我创建一个ICMP套接字并调用recvfrom()?我尝试通过套接字(AF_INET、SOCK_RAW、IPPROTO_ICMP)创建一个套接字,然后在其上调用 recvfrom()。 recvfrom() 返回 10022(WSAEINVAL) 错误,因为套接字未绑定。我应该如何解决这个问题?
    • 我不确定,我从来没有做过...试试这个:stackoverflow.com/questions/626541/listen-for-icmp-packets-in-c
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2014-04-25
    • 2019-01-08
    • 2012-02-09
    相关资源
    最近更新 更多