バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
ネットワークシミュレーションに向けてnpcap初期化処理の話。
登場人物
博識フクロウのフクさん
イラスト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
npcap初期化コードの元ネタ
太郎くん
npcapの初期化コードは以前動作させたpktdump_exをベースにしようかな。
フクさん
そうだね。
動作実績のあるコードを使用した方がいいだろう。
太郎くん
確か、ここでやったやつだね。
npcap初期化コードに必要なAPI
太郎くん
抜き出すにしても全部である必要はないから・・・。
太郎くん
pcap_findalldevs
と
pcap_open_live
を起点に抜き出せばいいかな。
フクさん
そうだね。
そのあとの、
pcap_next_ex
はパケット受信になるから初期化処理では不要だろう。
npcap初期化コード
太郎くん
で、実際の初期化コードはこんな感じで良いと思う。
int pcap_init()
{
#ifdef _WIN32
/* Load Npcap and its functions. */
if (!LoadNpcapDlls())
{
fprintf(stderr, "Couldn't load Npcap\n");
exit(1);
}
#endif
/* Retrieve the device list */
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
/* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}
if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
/* Check if the user specified a valid adapter */
if(inum < 1 || inum > i)
{
printf("\nAdapter number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}
/* Jump to the selected adapter */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
/* Open the adapter */
if ((pcap_fp = adhandle= pcap_open_live(d->name, // name of the device
65536, // portion of the packet to capture.
// 65536 grants that the whole packet will be captured on all the MACs.
1, // promiscuous mode (nonzero means promiscuous)
100, // read timeout
errbuf // error buffer
)) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}
}
npcap初期化コード説明
太郎くん
まぁ特に説明はいらないかな。
フクさん
そうだね。
使用しているAPIも以前説明したものだし。
太郎くん
ここで説明してたね。
pcap_findalldevs
pcap_open_live
太郎くん
次はnpcapの受信部分のコードを実装しないとねー。
まとめ
太郎くん
まとめだよ。
- npcap初期化コードに必要なAPI説明。
- pcap_findalldevs。
- pcap_open_live。
- ※ 両方とも以前説明済み。
- npcap初期化コードを作成。
- サンプルコードのpcap_next_exをベースに抜き出してきた。
バックナンバーはこちら。
コメント