c - FreeBSD:网络接口(interface)信息

标签 c networking interface freebsd

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

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

最佳答案

你总是可以使用 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 上,如果您需要获取接口(interface)的链路层地址,您需要查找 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          

关于c - FreeBSD:网络接口(interface)信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9148425/

相关文章:

c - 使用 C 中的子程序追加数组

java - 如何通过 KryoNet 发送用户信息?

mysql - 在 Go 中创建 MySql 接口(interface)的正确方法

c - 将外部静态库的段放置到特定位置

c - 从链表中删除节点(C)

c - 查看是否通过 tcp 传递了消息

c# - 通过网络读取和解析大型文本文件的最佳方式是什么?

c# - 依赖注入(inject),不知道在哪里放置方法

java - 你能写一个不能实现的接口(interface)吗?

使用 popen 更改目录