了解导致netlink中链接状态发生变化的界面

时间:2013-01-16 11:49:51

标签: netlink

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

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

2 个答案:

答案 0 :(得分: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套接字代码。

答案 1 :(得分: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感兴趣。