2013-01-16 54 views
0

我已經使用Netlink套接字編寫了一個程序。我能夠成功檢測到鏈接狀態的變化(即網絡電纜插入/拔出時)。但在這兩種情況下,我都會收到RTM_NEWLINK事件。知道在netlink中導致鏈接狀態變化的接口

我想我可以查詢SIOCGIFFLAGS並獲得IFF_UP狀態來了解使用getifaddrs系統調用狀態。爲此,我想知道導致鏈接事件的界面是什麼。有什麼方法可以知道嗎?目前我不知道結構nlmsghdrsockaddr_nl中的任何成員可能會導致鏈路更改的接口。

回答

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套接字代碼。

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感興趣。