FreeBSD: информация о сетевом интерфейсе - PullRequest
4 голосов
/ 05 февраля 2012

Я пытаюсь программно найти информацию о сетевых интерфейсах во FreeBSD.В linux интерфейсы перечислены в файле / etc / network / interfaces.

Есть ли такой файл во FreeBSD?Как я могу извлечь эту информацию?

1 Ответ

9 голосов
/ 05 февраля 2012

вы всегда можете использовать getifaddrs(3), вот пример:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
int main(void) {
    struct ifaddrs *ifap,*ifa;
    getifaddrs(&ifap);
    for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
        printf("%s\n",ifa->ifa_name);
    }
    freeifaddrs(ifap);
}

EDIT: в Linux, если вам нужно получить адрес канального уровня интерфейса, вам нужно искать AF_PACKET sa_family, которыйнаходится в netpacket / packet.h в linux, * bsd называется AF_LINK, а в net / if_dl.h

#ifdef AF_LINK
#   include <net/if_dl.h>
#endif
#ifdef AF_PACKET
#   include <netpacket/packet.h>
#endif


#ifdef AF_LINK
    #define SDL ((struct sockaddr_dl *)ifa->ifa_addr)
    if (SDL->sdl_family == AF_LINK) {
        bcopy(SDL->sdl_data + SDL->sdl_nlen,....,SDL->sdl_alen
    }
    #undef SDL
#endif
#ifdef AF_PACKET
    if (ifa->ifa_addr->sa_family == AF_PACKET) {
        struct sockaddr_ll *sl = 
            (struct sockaddr_ll*) ifa->ifa_addr;

        bcopy(sl->sll_addr,....,sl->sll_halen
    }
#endif          
...