Как получить MAC-адрес внешнего хоста в C ++
-
06-07-2019 - |
Вопрос
В настоящее время мы анализируем вывод запроса 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 могут различаться между платформы.