Nano Hash - криптовалюты, майнинг, программирование

Узнать MAC-адрес в Linux и FreeBSD на C

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


Ответы:


1

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

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

27.11.2011
  • Я не знал о том, что вы можете узнать свои собственные mac-адреса с помощью libpcap. Можете ли вы указать мне некоторые функции, которые могут помочь мне получить мой Mac? 27.11.2011
  • @ Blackie123: Обновил ответ. Чтобы включить пример. 27.11.2011
  • Похоже, слишком много проблем для меня. Почему бы просто не getifaddrs(3)? 28.11.2011

  • 2

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

    28.11.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..