1

netlink ソケットを使用して RTM_GETROUTE メッセージをカーネルに送信しました。今、カーネルのメッセージを聞いています。

カーネルは、応答として netlink ソケットを介してnlmsghdr構造体を送信します。そのメッセージ タイプ ( nlmsg_type )を知る必要がありますか? (私のコードは、ルーティングの削除/作成イベントもリッスンしています。区別したい)。

返信はまたRTM_GETROUTEですか?コード例やリンクは大歓迎です。

ルーティングについては、NEWROUTE、DELROUTE、および GETROUTE メッセージしか見つかりませんでしたが、3 つすべてに他の目的があるようです。(1回目はルート作成時、2回目は削除時、3回目は私が使っていたリクエスト時です。)

これがメッセージを送信するための私のコードです。

struct nlmsghdr* hdr;
struct rtmsg* nl_p;

nl_p = (struct rtmsg*) NLMSG_DATA(hdr);
memset(&nl_p, 0, sizeof(nl_p));

hdr->nlmsg_pid = 0;
hdr->nlmsg_seq = ++seq_num;
hdr->nlmsg_type = RTM_GETROUTE;

nl_p->rtm_family = AF_INET;
nl_p->rtm_dst_len = 0;
nl_p->rtm_src_len = 0;
nl_pload->rtm_table = RT_TABLE_MAIN;

rtable_success = send(fd, hdr, hdr->nlmsg_len, 0)

受信したメッセージを解析する例がありますが、他のメッセージを除外するには、必要なメッセージ タイプ ( nlmsg_type )を知る必要があります。

4

1 に答える 1

3

http://libdnet.sourceforge.net/に libdnet プロジェクトがあります。

route_get 関数で質問の答えを見つけることができます。

于 2016-10-14T12:29:41.853 に答える