0

Netlink ソケットを使用してプログラムを作成しました。リンク ステータスの変化 (つまり、ネットワーク ケーブルのプラグが差し込まれた/抜かれたとき) を正常に検出できます。しかし、どちらの場合も、RTM_NEWLINKイベントを取得しています。

getifaddrs システム コールを使用して、ステータスを照会しSIOCGIFFLAGSてステータスを取得できると考えました。IFF_UPそのためには、リンク イベントの原因となったインターフェイスを知りたいと思います。それを知る方法はありますか?現在、構造体のメンバーnlmsghdrsockaddr_nl、リンクの変更を引き起こしたインターフェイスを提供するメンバーを認識していません。

4

2 に答える 2

0

SIOCIFCONF ioctl 呼び出しを使用すると、使用可能なすべてのインターフェイスを反復処理できます。そして、SIOCGIFFLAGS と IFF_UP および IFF_RUNNING を使用して、そのインターフェイスのステータスを確認できます。しかし、ブリッジングを行い、そのブリッジに 1 つまたは 2 つのインターフェースを追加する場合、SIOCGIFCONF はあまり役に立ちません。

最近はネットリンクも扱っています。私の問題は、「リンクステータスの変更を引き起こしたインターフェースを知る」という問題とほとんど同じです。私が作成したリンクを参照してください: 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 に答える
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 を期待します...または何か不足している可能性があります...

はい、何かが足りませんでした :) fi->ifi_flags を見るだけでステータスを取得できます。必要に応じて、IFF_UP、IFF_RUNNING、IFF_LOWER_UP に興味があると思います。

于 2014-03-20T19:56:12.203 に答える