GetTcpTable()
не дает вам IP-адрес назначения TCP-пакетов. Он просто дает вам список прослушиваемых в настоящее время TCP-портов и активных TCP-подключений.
GetUdpTable()
может дать вам список прослушиваемых в настоящее время UDP-портов, на которые можно отправлять UDP-пакеты. В UDP нет соединений.
Но если вы хотите знать фактический IP-адрес назначения для каждого полученного пакета UDP и без необходимости использовать низкоуровневую библиотеку захвата, такую как WinPCap, тогда вы можете использовать * Функция 1007 *WSARecvMsg()
для приема ваших пакетов UDP вместо использования функции recvfrom()
или даже recv()
.
WSARecvMsg()
может сообщать метаданные о каждом пакете, в частности, IP_PKTINFO
(IPv4) и IPV6_PKTINFO
(IPv6) управляющие блоки, которые определяют IP-адрес назначения пакета и индекс сетевого интерфейса, получившего пакет.
Вам необходимо использовать WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER)
для получения указателя на функцию WSARecvMsg()
(см. Почему функция WSARecvMsg реализована как указатель функции и можно ли повторно использовать этот указатель? по причине, почему), и используйте setsockopt()
, чтобы включить опцию сокета IP_PKTINFO
/ IPV6_PKTINFO
, прежде чем начинать вызывать WSARecvMsg()
для получения пакетов.
См. Функция для получения заголовка целевой рекламы платье из пакета в windows XP для примера.