バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
npcap 次のパケットを読み込むAPIについて。
有効なパケットキャプチャディスクリプタ
pcap_pkthdr構造体
パケットデータ
などが引数となる。
登場人物
博識フクロウのフクさん

イラスト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

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

うーん、簡単に言うとパケットを取得してくれるAPI?

一言で言うとそうだねー。
pcap_next_ex API仕様

APIの型はこれ
int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char **pkt_data)

引数はこれ。
p:有効なパケットキャプチャディスクリプタへのポインタ
pkt_header:pcap_pkthdr構造体へのポインタへのポインタ
pket_data:パケットデータの先頭へのポインタへのポインタ

なんか・・・。
ポインタのポインタ????

(あー、そこで引っかかったか―)

ポインタのポインタは一回忘れてもらってー。

良し!忘れた!

(潔すぎる)
多重ポインタの一般的な使い方

使い方としては、
struct pcap_pkthdr *pheader;
u_char *pdata
と定義して、
APIに渡す際に
pcap_next_ex(p,&pheader,&pdata)
ってするだけ。

ん?
どこもさしてないポインタを渡すの?
なんかダメな使い方なんじゃない?

別にダメではない。
pcap_next_ex APIの中でポインタの参照先を設定してくれるって動作になる。

???

*pdeader は参照先
pheader は参照先のアドレスを格納
&pheaderは?

あ、
pheaderって「参照先のアドレス」を格納した「変数のアドレス」!

そのアドレスをAPIに渡して、書き換えてもらうと?

pheaderの参照先が決まって、*pheaderで参照できる!

なるほど!
こんな使い方があるのか!

まぁ多重ポインタの一般的な使い方の一種だねー。
普通はpheaderの参照先を明示的に解放するようなAPIもあるんだけど、
pcapの場合は特に明示的解放は要らないようだ。

無くてもいいの?

たぶん、pcap_next_exを再度呼び出し段階で解放されるんだろうねー。

でも、使い方はわかったぞ!
まとめ

まとめだよ。
- 次のパケットを読み込むAPIについて説明。
- 多重ポインタが使われている。
- 参照先をAPI内で設定してもらう割と一般的な使い方。
バックナンバーはこちら。
コメント