Используйте библиотеку 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 более переносим, хотя бы потому, что кто-то другой сделал всю работу по переносимости и все дополнительные функции, которые вы получаете, используя его.
Надеюсь, это поможет.