続く以下のコードは、アダプタリストを取り出してそれを画面に表示し、アダプタが見つからなければエラーを表示します。
#include "pcap.h" main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
/* 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;
}
/* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs);
}
このコードについて、幾つかのコメントを記します。
最初に、他のlibpcap関数と同様 pcap_findalldevs() はエラーバッファ(errbuf)パラメータを持っています。このパラメータは、何かうまくいかない時に、libpcapによってエラーの記述が格納され た文字列を指します。
次に、pcap_findalldevs() はUnix下においてもlibpcapによって提供されることに注目してください。ですが、全てのlibpcapにサポートされるOSがネットワークイン ターフェイスの詳細を提供する訳ではない事を覚えておいてください。従って、もしポータブルアプリケーションを作成したければ、ネットワークインターフェ イスの詳細がNULLだった時のケースを考えなければなりません。そういった場合は、「得られる詳細がありません(No description available)」といったエラーを表示する必要があります。
最後に、プログラムを終了するときに一旦 pcap_freealldevs()
関数でネットワークアダプタリストを開放していることに注目してください。
それではこの最初のサンプルとコンパイルして実行してみましょう。UnixやCygwin下でコンパイルするためには以下の文を宣言します:
gcc -o testaprog testprog.c -lpcap
Windowsではプロジェクトを生成する必要がありますので、このマニュアル内のセクション「プログラムでWinPcapを利用する方法」 にある手順を参照してください。ですが、多くの正確に構成されたアプリケーション用例、この入門編とプロジェクトに出てくる全てのコード、サンプルプログ ラムをコンパイルして実行するのに必要なインクルードファイルとライブラリが収容されたデベロッパーズパック(http://winpcap.polito.it で配布されている)を使用することをお奨めします。
プログラムがコンパイルできたとして、実行してみましょう。筆者のWinXPワークステーションではこのような結果になりました。
1. {4E273621-5161-46C8-895A-48D0E52A0B83} (Realtek
RTL8029(AS) Ethernet Adapter)
2. {5D24AE04-C486-4A96-83FB-8B5EC6C7F430} (3Com EtherLink PCI)
見て分かる通り、Windows下ではネットワークアダプタの名前(デバイスをオープンしたときにlibpcapに渡される)が判読できませんの で、続く隣にある解説はユーザーにとって非常に有効なものとなっています。
documentation. Copyright (c)2002-2003 Politecnico di Torino.
2005 translated by Telebusiness,Inc.
All rights reserved.