バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
npcap ネットワークデバイスのリストの構築のAPI。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ネットワークデバイスのリストの構築のAPI

じゃーまずはネットワークデバイスのリストの構築について。
- pcap_findalldevs:ネットワークデバイスのリストの構築。 ← これ
- pcap_open_live:ネットワーク上のパケットを見るためにパケットキャプチャハンドルを取得。
- pcap_next_ex:次のパケットを読み込んで、成功/失敗の指示を返す。

これは説明通りな気はしているけど、
リストの構築
ってのが曲者感があるなー。

そーだねー。
そこが今回の説明の支配的になるところかなー。
pcap_findalldevs API仕様

まずAPIは以下。
int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)

戻り値、引数の仕様は以下
戻り値:成功すれば、0が返る。エラーが発生した場合は、-1が返り、errbufにその理由が格納。
alldevsp:監視可能なディバイスのリストの最初の要素へのポインタ。
errbuf:エラーが発生したときにその理由が入る文字配列。
pcap_if_tとは

うーん、pcap_if_tという型が何ものかってところだねー。

構造体としてはpcap.hで以下の定義になってる。
struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};

struct pcap_ifの中にまたstruct pcap_ifへのポインタがあるね。

うん。
自己参照構造体って呼ばれる実装方式だね。

もしかして、これって連結リストってやるじゃない?

おー!
よく気が付いたね。

たしかlwIPの時に出てきたヤツだ。
ここでやったね。
pcap_if_tの使い方

とりあえず連結リストだとわかったところで、
実際のアクセスの仕方はこうなる。
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
exit(1);
}
/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s\n ", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

おー。
for文で回せるんだ。

そうそう。
これが連結リストの応用性の高さだね。
dというローカル変数に先頭ポインタを渡して、
d->nextが次の要素への参照。
リスト終端がNULLなんで、
NULLに到達すると同時にfor文を抜ける感じ。

うん。
連結リストであることと、
実際の参照の仕方はわかったと思う。
まとめ

まとめだよ。
- npcapのネットワークデバイスのリストの構築のAPIの説明。
- pcap_findalldevsを使用する。
- リストは連結リストでfor文で回して走査できる。
バックナンバーはこちら。
コメント