【问题标题】:FreeBSD: network interface informationFreeBSD:网络接口信息
【发布时间】:2012-02-05 10:15:40
【问题描述】:

我正在尝试以编程方式在 FreeBSD 中查找网络接口信息。在 linux 中,接口列在 /etc/network/interfaces 文件中。

FreeBSD 中有这样的文件吗?如何提取这些信息?

【问题讨论】:

    标签: c networking interface freebsd


    【解决方案1】:

    你总是可以使用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);
    }
    

    编辑:在 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          
    

    【讨论】:

    • 这列出了重复的条目,但我明白了你的意思。我会研究结构。
    • @hari,是的,因为它为每个分配给接口的*地址都有一个条目(无论是链路层、ipv4、ipv6 ..),您可以在 linux、macosx、* bsd - 有一些差异 - 就像 AF_LINK 在 linux 上不存在,但它的名称为 AF_PACKET 用于链接层 - 编辑帖子以反映这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多