我已經使用Netlink套接字編寫了一個程序。我能夠成功檢測到鏈接狀態的變化(即網絡電纜插入/拔出時)。但在這兩種情況下,我都會收到RTM_NEWLINK
事件。知道在netlink中導致鏈接狀態變化的接口
我想我可以查詢SIOCGIFFLAGS
並獲得IFF_UP
狀態來了解使用getifaddrs系統調用狀態。爲此,我想知道導致鏈接事件的界面是什麼。有什麼方法可以知道嗎?目前我不知道結構nlmsghdr
或sockaddr_nl
中的任何成員可能會導致鏈路更改的接口。
我已經使用Netlink套接字編寫了一個程序。我能夠成功檢測到鏈接狀態的變化(即網絡電纜插入/拔出時)。但在這兩種情況下,我都會收到RTM_NEWLINK
事件。知道在netlink中導致鏈接狀態變化的接口
我想我可以查詢SIOCGIFFLAGS
並獲得IFF_UP
狀態來了解使用getifaddrs系統調用狀態。爲此,我想知道導致鏈接事件的界面是什麼。有什麼方法可以知道嗎?目前我不知道結構nlmsghdr
或sockaddr_nl
中的任何成員可能會導致鏈路更改的接口。
使用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套接字代碼。
你可以從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感興趣。