c - 如何在 C 中找到我的 Tap 适配器的桥接设备名称?

标签 c linux network-programming

在 Linux 上,使用 C,如何找到我的以太网接口(interface)所连接的桥接设备的名称?是否需要进行一系列 ioctl() 调用才能找到主桥设备?

我的 C 程序从配置文件中知道我的 TAP 适配器的设备名称(在本例中为 tap0)。最后,我需要我的 TAP 适配器响应的 IP 地址。因为它是桥接的,所以 TAP 适配器没有 IP 地址;它是具有 IP 地址的 bridge 设备。

我有一个 TAP 设备和 VETH 设备桥接在一起。 ip a 显示以下内容:

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 500
    link/ether 22:d4:fa:a4:89:81 brd ff:ff:ff:ff:ff:ff
3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff
    inet 10.20.30.40/24 scope global br0
       valid_lft forever preferred_lft forever
45: veth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff

注意 tap0veth0 条目:它们的每个网桥主控都是 br0(即,它们有网桥 master br0)。

当我调用 ioctl(SIOCGIFFLAGS),随后当 ifr_nametap0 时调用 ioctl(SIOCGIFPFLAGS),唯一设置的标志是 IFF_UPIFF_BROADCAST。我不知道从这里去哪里。

最佳答案

iputils 和 friend 们在内核和用户空间之间使用 rtnetlink API(POSIX 套接字 API 太窄,无法执行所有需要的任务,而且没有干净的方法来添加通知)。如果您的项目很小,那么解析 ip 实用程序的输出可能会更容易、更快。这是从为嵌入式 linux 项目编写网络配置守护进程的经验中得出的。 rtnetlink API 最初使用起来有点棘手,但如果您真的想要(许多指针和大小引用需要正确),请对其进行一些研究并使用 iputils 源作为起点。

关于c - 如何在 C 中找到我的 Tap 适配器的桥接设备名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165017/

相关文章:

c - 未指定的返回值

c - 如何使用 C 将变量作为结构体传递给函数?

c - 意外标记附近的语法错误

以特定精度将小值与零进行比较

c - 当 C 需要特殊类型的 makefile 时,将 Fortran 90 与 C 混合使用?

linux - 具有相对偏移的短跳未使用我期望的偏移

MySQL 查询被杀死——如何防止这种情况发生?

java - Java UDP 多线程最佳实践

c++ - C++ 网络库

c++ - 如何以编程方式在 Qt 中获取网络管理器设备名称?