Я пытаюсь узнать MAC-адрес, и мне удалось создать рабочее решение с использованием sysctl в Linux, проблема в том, что это решение не работает в версии FreeBSD, над которой я разрабатываю. Есть ли способ узнать MAC-адрес в C, кроме как с помощью sysctl?
Узнать MAC-адрес в Linux и FreeBSD на C
Ответы:
Используйте библиотеку libpcap. Это самый многоплатформенный способ, который вы можете найти.
Эта библиотека используется для сетевых анализаторов и обнаружения вторжений, а также для измерения другой сетевой статистики. Утилита nethogs для измерения использования сети для каждого процесса, iftop используется для измерения использования полосы пропускания для каждой машины/порта. Очень гибкий во многих ролях.
Написан на C, но есть обертки для других языков.
1: http://en.wikipedia.org/wiki/Pcap
[2]: http://www.tcpdump.org
[3]: http://sourceforge.net/projects/libpcap/
Изменить: вот полный, точный и рабочий пример с подробным кодом и функциями:
http://coderrr.wordpress.com/2008/03/07/get-the-mac-address-локального-ip/
Существует множество руководств, а исходный код — ваш лучший друг.
Редактировать 2: blaze указал getifaddrs(3)
, который, похоже, выполняет свою работу, всего несколько предостережений, это не posix-функция. Это функция bsd, которую glibc linux поддерживает, но НЕ документирует. Это почти недокументированная фича :-)
Вся документация представлена в виде справочных страниц и взята из руководства на kernel.org:
Не в POSIX.1-2001. Эта функция впервые появилась в BSDi и присутствует в системах BSD, но с немного другой задокументированной семантикой — возврат одной записи для каждого интерфейса, а не для каждого адреса. Это означает, что ifa_addr и другие поля могут фактически иметь значение NULL, если у интерфейса нет адреса, и адрес на уровне канала не возвращается, если интерфейсу назначен IP-адрес. Кроме того, способ выбора ifa_broadaddr или ifa_dstaddr различается в разных системах.
а также
Адреса, возвращаемые в Linux, обычно представляют собой адреса IPv4 и IPv6, назначенные интерфейсу, а также один адрес AF_PACKET для каждого интерфейса, содержащий сведения более низкого уровня об интерфейсе и его физическом уровне. В этом случае поле ifa_data может содержать указатель на структуру net_device_stats, определенную в , которая содержит различные атрибуты интерфейса и статистику.
Так что его поведение может различаться, и вам все равно придется #ifndef
компилировать.
Страница руководства kernel.org по адресу http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html содержит пример кода, который может оказаться полезным. Моя локальная справочная страница Linux довольно бедна по сравнению с приведенной выше ссылкой.
Я все еще думаю, что libpcap более переносим, хотя бы потому, что кто-то другой проделал всю работу по переносимости и все дополнительные функции, которые вы получаете, используя его.
Надеюсь это поможет.
getifaddrs(3) возвращает IP-адреса и MAC-адреса на локальных интерфейсах. Портативный между Linux и FreeBSD.