The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Решение: Как определить свой MAC-адрес"
Отправлено Mariupolets, 06-Фев-08 22:47 
Спасибо всем за ответы.

Действительно, есть функция getifaddrs, возвращающая все адреса (и МАКи) для всех интерфейсов. И как я понимаю, она использует всё тот-же ioctl с запросом SIOCGIFADDR (или что-то вроде).

Кому нужно, вот пример:

#include <sys/types.h>         // библиотека различных "макротипов"
#include <sys/socket.h>     // библиотека для работы с сокетами
#include <net/if_dl.h>         // библиотека для работы с Link Layer адресами
#include <ifaddrs.h>        // библиотека для работы с адресами интерфейсов
#include <string.h>        // библиотека работы со строками

/* Функция получения MAC-адреса, возвращает структуру типа ether_addr (ethernet.h)*/
struct ether_addr *GetMyMAC(    
        char *ifname     // входной параметр - имя интерфейса
           ){
    struct ifaddrs *ifa, *ifap; // структуры (ifaddrs.h) для получения адресов интерфейсов
    struct sockaddr_dl *sdl;    // структура (if_dl.h) содержит MAC-адресс (и не только)

    /* получение всех адресов (Ethernet, IP, IP6 ... ) всех интерфейсов */
    if(getifaddrs(&ifap)<0 ) return (NULL);
    
    for(ifa = ifap; ifa; ifa = ifa->ifa_next){
    
    /* поиск нужного интерфейса и адреса */
    if( (ifa->ifa_addr->sa_family != AF_LINK) ||    // поиск по типу адреса Link Layer
        (strcmp(ifa->ifa_name,ifname) != 0) ) {    // поиск по имени интерфейса
        continue;
    }
    freeifaddrs(ifap);    // очистка памяти - необязательно
    return (struct ether_addr *)
            (LLADDR((struct sockaddr_dl *)ifa->ifa_addr)); // возврат MAC-адресa
    }
    freeifaddrs(ifap); // очистка памяти
    return(NULL); // возврат ошибки
    
}

int main(){
    struct ether_addr *MAC = GetMyMAC("bge0");
    if(MAC != NULL) printf("My MAC is %s\n", ether_ntoa(MAC));
    else printf("Can't get MAC\n");    
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру