WinPcapノート(2):デバイスリストの取得

2194 ワード

通常、WinPcapベースのアプリケーションを作成する最初のことは、接続されたネットワークアダプタのリストを取得することです.WinPcapはpcap_を提供していますfindalldevs_ex()関数はこの機能を実現する:pcap_を返すif構造のチェーンテーブルで、このような構造にはアダプタの詳細が含まれています.pcap_findalldevs_ex()関数の具体的なフォーマットは以下の通りです.
pcap_findalldevs_ex(
                    char * source,
                    struct pcap_rmthauth* auth,
                    pcap_if_t** alldevs,
                    char* errbuf
                   );

関数は、関数pcap_によって作成されます.Open()が開いているネットワークデバイスチェーンテーブル.この関数は、ローカルマシンのすべてのデバイスだけでなく、リモートマシンのすべてのデバイスもリストできます.
パラメータの意味:
ソース:ソースの場所を保存する文字ポインタで、アダプタを検索するときにチェックします.ここでPCAP_に設定します.SRC_IF_STRING;
auth:pcap_を指すrmtauth構造体のポインタ.このポインタは、リモート・デバイスがプロトコル認証を取得する必要がある情報を保存します.ローカルデバイスをキャプチャするため、NULLに設定します.
alldevs:pcap_if_t構造体ポインタ、関数が戻ったときに見つけたアダプタの情報を保存するために使用される.
errbuf:エラー情報を保存するために使用されます.
戻り値:
0を返すと、関数が正常に実行されたことを示します.alldevsはNULLではありません.適切なアダプタが見つかり、alldevsパラメータと同じように戻ります.-1を返すと、エラーが発生したり、ローカルで適切なアダプタが見つからなかったりします.
pcap_if_t構造体は以下のように定義される.
pcap_if* next;//チェーンテーブルの次のノードを指し、pcap_を空で指定しない場合はif要素;
char* name;//文字列ポインタ、ストレージ転送pcap_open_live関数のデバイス名;
char* description;//デバイスの説明
pcap_addr* addresses;//このデバイスインタフェースアドレスチェーンテーブルの最初の要素です.
u_int flags;//現在の唯一の値はPCAP_です.IF_LOOPBACKは、現在のインタフェースがループインタフェースである場合に設定される.
デバイスリストの使用が完了したら、pcap_を呼び出す必要があります.freealldevs()関数はメモリリソースを解放します.
次に、デバイスのリストを取得し、詳細情報を印刷するコードを示します.
#include "pcap.h"

int main()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int i = 0;
	char errbuf[PCAP_ERRBUF_SIZE];

	/* */
	if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL/*auth is not needed*/, &alldevs, errbuf) == -1)
	{
		fprintf(stderr, "Error in pcap_findalldevs_ex:%s
", errbuf); exit(1); } /* */ for (d = alldevs;d != NULL;d=d->next) { printf("%d. %s", i++, d->name); if (d->description) printf(" (%s)
", d->description); else printf(" (No description available)
"); } if (i == 0) { printf("
No interfaces found!
"); exit(1); } //free pcap_freealldevs(alldevs);
	return 0;
}
の結果は次のとおりです.