0

我已经使用 Netlink 套接字编写了一个程序。我能够成功检测到链接状态的变化(即,插入/拔出网络电缆时)。但在这两种情况下,我都得到了一个RTM_NEWLINK事件。

我想我可以使用 getifaddrs 系统调用查询SIOCGIFFLAGS并获取IFF_UP状态以了解状态。为此,我想知道导致链接事件的接口是什么。有办法知道吗?目前我不知道结构中的任何成员,nlmsghdr或者sockaddr_nl会给出导致链接更改的接口。

4

2 回答 2

0

您可以从 ifi_index 中获取名称:

struct ifinfomsg *ifi   = NLMSG_DATA(h);
char name[IF_NAMESIZE];
printf("%s is %s\n", if_indextoname(ifi->ifi_index, name), ifi->ifi_flags & IFF_UP ? "up":"down");

其中 h 是您的 nlmsghdr 结构。

我显然不是专家,但我发现当你插入和拔出电缆时得到 RTM_NEWLINK 很有趣。当电缆被拔下时,我希望 RTM_DELLINK ......或者我可能遗漏了一些东西......

是的,我遗漏了一些东西 :) 您只需查看 ifi->ifi_flags 即可获得状态。根据您的需要,我猜您会对 IFF_UP、IFF_RUNNING 和 IFF_LOWER_UP 感兴趣。

于 2014-03-20T19:56:12.203 回答
0

使用 SIOCIFCONF ioctl 调用,您可以遍历所有可用的接口。然后使用 SIOCGIFFLAGS 和 IFF_UP 和 IFF_RUNNING 您可以检查该接口的状态。但是如果您进行桥接并向该桥添加一两个接口,SIOCGIFCONF 并没有多大帮助。

这些天我也在处理netlink。我的问题几乎与您的“了解导致链接状态更改的界面”相似。请参考我创建的链接:https ://superuser.com/questions/596296/how-to-identify-that-one-of-the-bridge-interfacessw-bridge-in-linux-is-down

您能否发布您的netlink套接字代码。

于 2013-05-17T07:33:58.020 回答