在 C++ 中获取传入 UDP 数据包的目标 IP

Getting the destination IP of incoming UDP packet in C++

我找到了函数:GetTcpTable in C++. In the header: iphlpapi.h. That gives me the destination IP of TCP packet and I was wondering if there's a function from the same header that would give me the destination IP of UDP packet... I tried the function: GetUdpTable 但它只给出了 本地 IP 和端口 。当然,如果该函数也有 C++ 中的代码示例,我将非常高兴。 还是谢谢你!

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

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

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

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

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

在开始调用WSARecvMsg()接收数据包之前,您需要使用WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER) to obtain a pointer to the WSARecvMsg() function (see for the reason why), and use setsockopt()启用IP_PKTINFO/IPV6_PKTINFO套接字选项。

有关示例,请参阅