バックナンバーはこちら。
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内で設定してもらう割と一般的な使い方。
バックナンバーはこちら。
コメント