Узнайте MAC-адрес в Linux и FreeBSD в C - PullRequest
3 голосов
/ 27 ноября 2011

Я пытаюсь выяснить MAC-адрес, и мне удалось создать работающее решение с использованием sysctl в Linux, проблема в том, что это решение не работает с версией FreeBSD, над которой я работаю.Есть ли способ узнать MAC-адрес в C, кроме использования sysctl?

Ответы [ 2 ]

6 голосов
/ 27 ноября 2011

Используйте библиотеку 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-of-a-local-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 может содержать указатель на структуру struct net_device_stats, определенную в, которая содержит различные атрибуты интерфейса и статистику.

Так что это может отличаться по поведению, и вам может потребоваться #ifndef компилировать в любом случае.

Справочная страница kernel.org по адресу http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html содержит пример кода, который может оказаться полезным.Моя локальная справочная страница по linux довольно бедна по сравнению с вышеупомянутой ссылкой.

Я все еще думаю, что libpcap более переносим, ​​хотя бы потому, что кто-то другой сделал всю работу по переносимости и все дополнительные функции, которые вы получаете, используя его.

Надеюсь, это поможет.

2 голосов
/ 28 ноября 2011

getifaddrs (3) возвращает IP-адреса и MAC-адреса на локальных интерфейсах.Переносим между Linux и FreeBSD.

...