Обнюхивать все сетевые интерфейсы - PullRequest
2 голосов
/ 07 марта 2011

Я написал программу, которая использует сокеты для захвата пакетов на сетевых интерфейсах. Сначала я собираю все IP-адреса своей машины, используя gethostbyname , затем привязываю необработанный сокет к каждому ip с SOCK_RAW , IPPROTO_IP и SIO_RCVALL, Поток выполняется для каждого IP, который вызывает recv на соответствующем сокете (один сокет для каждого ip). Эта программа отлично работает.

Но я нашел специальный адрес с именем INADDR_ANY . MSDN сообщает, что SIO_RCVALL нельзя использовать с INADDR_ANY, здесь :

Сокет также должен быть привязан к явный локальный интерфейс IPv4 или IPv6, это означает, что вы не можете связать с INADDR_ANY или in6addr_any.

Можно ли отслеживать и перехватывать все пакеты (пакеты, относящиеся к локальному компьютеру, а не пакеты других компьютеров) с помощью одного сокета?

Спасибо

1 Ответ

2 голосов
/ 07 марта 2011

INADDR_ANY означает «Мне все равно, какой локальный адрес» , а не «Все локальные адреса».

С MSDN :

Если приложению все равно, какой локальный адрес назначен, укажите постоянное значение INADDR_ANY для локального адреса IPv4 или постоянное значение in6addr_any для локального адреса IPv6 в sa_data член параметра name .Это позволяет базовому поставщику услуг использовать любой подходящий сетевой адрес, что потенциально упрощает прикладное программирование в присутствии многосетевых хостов (то есть хостов, которые имеют более одного сетевого интерфейса и адреса).

...