The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как определить свой MAC-адрес, !*! Mariupolets, 05-Фев-08, 01:13  [смотреть все]
Доброго времени...

Кто знает, как в FreeBSD программно определить MAC-адрес интерфейса(ов) компьютера. Может быть очень простой вопрос, но я так и не могу понять, как это сделать. Под линукс есть запрос через ioctl для этого, но во Фре не нашёл ничего подобного.

Заранее благодарен.

  • Как определить свой MAC-адрес, !*! pavel, 02:16 , 05-Фев-08 (1)
  • Как определить свой MAC-адрес, !*! Guest, 21:13 , 05-Фев-08 (5)
  • Решение: Как определить свой MAC-адрес, !*! Mariupolets, 22:47 , 06-Фев-08 (6)
    Спасибо всем за ответы.

    Действительно, есть функция 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");    
    }




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

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