Как получить MAC-адрес внешнего хоста в C ++ - PullRequest
4 голосов
/ 07 мая 2009

В настоящее время мы анализируем вывод запроса arp из командной строки.

string cmd = "arp -n ";
cmd.append(ipaddress);
cmd.append(" | grep ");
cmd.append(ipaddress);
fgets( line, 130, fp);
fgets( line, 130, fp);
ret.append(line);
 ...

Это работает, но есть ли способ сделать это, используя библиотечную функцию, которая не будет сильно зависеть от собственного интерфейса командной строки? В настоящее время проект использует libpcap.

Ответы [ 2 ]

2 голосов
/ 07 мая 2009

Я немного волнуюсь за

получить MAC-адрес внешнего хоста

часть вашего вопроса.

Я надеюсь, что вы знаете, что вы получаете записи в таблице ARP только для машин в одной сети. Если вы подключитесь к машине через маршрутизатор, вы увидите только MAC-адрес маршрутизатора в таблице ARP. Таким образом, невозможно узнать MAC-адрес внешнего хоста , если только он не является хостом в той же сети (без участия маршрутизаторов).

Таким образом, ответ заключается в том, что для хостов, которые достигаются через маршрутизатор, это невозможно, и если хост доступен в локальной сети, вы можете использовать только методы доступа, специфичные для платформы, поскольку даже выходные данные команды arp могут различаться платформы.

2 голосов
/ 07 мая 2009

В целом, это будет зависеть от вашей ОС. Для этого нет реального стандартного API.

Если вы работаете в Linux, откройте и выполните синтаксический анализ / proc / net / arp. Формат аналогичен формату вывода команды arp. Обратите внимание, что вы должны отправить пакет по рассматриваемому IP-адресу хотя бы один раз, чтобы иметь его в таблице ARP, и, конечно, вы не получите ничего за пределами вашего локального сегмента.

Достать IP-адрес в этот кэш достаточно просто - просто отправьте ему пакет UDP, например, на какой-то неиспользуемый порт, а затем выполните опрос, пока он не появится.

Другой альтернативой может быть использование необработанного сокета для создания и отправки собственного пакета arp, но это гораздо сложнее :) Если вы действительно хотите пойти по этому пути, изучите исходный код для arping (страница закрыта сегодня, но git repo онлайн), что также может дать вам немного больше переносимости, используя библиотеки, независимые от платформы, такие как libpcap (но требует root)

...