The OpenNET Project / Index page

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



"Как определить свой MAC-адрес"
Версия для распечатки Пред. тема | След. тема
Форум Программирование под UNIX
Исходное сообщение [ Отслеживать ]

. "Решение: Как определить свой MAC-адрес" +/
Сообщение от Mariupolets (ok), 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");    
}

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Как определить свой MAC-адрес, Mariupolets, 05-Фев-08, 01:13  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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