【问题标题】:Getting the destination IP of incoming UDP packet in C++在 C++ 中获取传入 UDP 数据包的目标 IP
【发布时间】:2020-06-28 23:09:15
【问题描述】:

我在 C++ 中找到了函数:GetTcpTable。在标题中:iphlpapi.h。这给了我 TCP 数据包的 目标 IP,我想知道是否有来自同一个标头的函数可以给我 目标 IP UDP 数据包...我尝试了该功能:GetUdpTable,但它只提供本地 IP 和端口。当然,如果该函数还有 C++ 中的代码示例,我会非常高兴。 还是谢谢你!

编辑: 我现在使用 pcap.h,但我仍然不知道如何捕获 UDP 数据包并从它们那里获取 ip。有没有我可以使用的代码?

【问题讨论】:

    标签: c++ winapi udp ip-address packet


    【解决方案1】:

    GetTcpTable() 不会给你 TCP 数据包的目标 IP。它只是为您提供当前正在侦听的 TCP 端口和活动 TCP 连接的列表。

    GetUdpTable() 可以为您提供当前正在侦听的 UDP 端口的列表,UDP 数据包可以发送到这些端口。 UDP 中没有连接。

    但是,如果您想知道接收到的每个 UDP 数据包的实际目标 IP,并且不必使用 WinPCap 等低级捕获库,那么您可以使用 WSARecvMsg() 函数来接收您的 UDP 数据包,而不是而不是使用recvfrom() 甚至recv() 函数。

    WSARecvMsg() 可以报告每个数据包的元数据,最值得注意的是IP_PKTINFO (IPv4) 和IPV6_PKTINFO (IPv6) 控制块,它们指定数据包的目标 IP 和接收到数据包的网络接口的索引数据包。

    您需要使用WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER) 来获取指向WSARecvMsg() 函数的指针(原因参见Why is the WSARecvMsg function implemented as a function pointer and can this pointer be reused?),并使用setsockopt() 启用IP_PKTINFO/IPV6_PKTINFO 套接字选项,之前你开始调用WSARecvMsg() 来接收数据包。

    有关示例,请参阅 Function to retrieve the header destination address from a packet in windows XP

    【讨论】:

    猜你喜欢
    • 2017-09-26
    • 2012-03-03
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2011-11-01
    • 2017-05-13
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多