Получение IP-адреса входящего пакета UDP в C ++ - PullRequest
0 голосов
/ 17 марта 2020

Я нашел функцию: GetTcpTable в C ++ . В шапке: iphlpapi.h . Это дает мне IP-адрес назначения из TCP пакета, и мне было интересно, есть ли функция из того же заголовка, которая выдала бы мне IP-адрес назначения из UDP пакет ... Я попробовал функцию: GetUdpTable , но он дает только локальный IP и порт . Я буду более чем счастлив, если у этой функции также есть пример кода в C ++ , конечно. В любом случае, спасибо!

РЕДАКТИРОВАТЬ: Я сейчас использую pcap.h и до сих пор не знаю, как перехватывать UDP-пакеты и получать от них IP-адреса. Есть код, который я могу использовать?

1 Ответ

3 голосов
/ 17 марта 2020

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 для примера.

...