【Ethernet】車載ネットワーク その51【npcap⑥】

【Ethernet】車載ネットワーク その51【npcap⑥】 車載ネットワーク

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

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました