Вопрос

В настоящее время мы анализируем вывод запроса 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.

Это было полезно?

Решение

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

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

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

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

Другие советы

Я немного беспокоюсь о

  

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top