メイン   モジュール   デー タ構造   ファイルリスト   データフィールド   グローバル   関連ページ   注意事項   English

トラフィックのフィルタリング
[WinPcap プログラミング入門編]


 WinPcap(libpcap同様)が備えている強力な機能の一つが、フィルタリング園児です。このフィルタリングエンジンは、ネットワークトラ フィックからサブセットだけを受け取る効率の用意方法を提供し、(通常は)OSによって備えられたキャプチャメカニズムで統合されます。パケットをフィル タするのに使用される関数は、 pcap_compile()pcap_setfilter()で す。

pcap_compile() はフィルタを翻訳(コンパイル)する、すなわちハイレベルな論理式で文字列を取り込み、パケットドライバによって解析可能なローレベルのフィルタリングバ イナリを生成します。論理式の構文は、この資料中の 「フィルタ リングの表現シンタックス」の中にあります。

pcap_setfilter() はフィルタを、カーネルドライバ中のキャプチャセッションに関連付けます。この時点でフィルタはネットワークからやってくる全てのパケットに適用され、全 てのコンフォーマント(適合した)パケットが実際にアプリケーションにコピーされます。

 続く以下のコードは、フィルタのコンパイルとセットの仕方を示しています。アダプタの記述をしている構造体 pcap_if からネットマスクを取り出さなければならないことに留意してください。なぜなら、pcap_compile() によって送出されたフィルタの中にはそれを要求するものもあるからです。

 この断片コード中の pcap_compile() に移されたフィルタは"ip and tcp" で、それは「TCPとIPv4量のパケットだけをキープしてアプリケーションへ送れ」ということを意味しています。

    if(d->addresses != NULL)
/* Retrieve the mask of the first address of the interface */ netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else /* If the interface is without an address we suppose to be in a C class network */ netmask=0xffffff; //compile the filter if(pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) <0 ){
fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
/* Free the device list */ pcap_freealldevs(alldevs);
return -1;
}

//set the filter if(pcap_setfilter(adhandle, &fcode)<0){
fprintf(stderr,"\nError setting the filter.\n");
/* Free the device list */ pcap_freealldevs(alldevs);
return -1;
}

 このレッスンで示したフィルタリング機能を使用した実行サンプルをご覧になりたい方は次のレッスンの「パケットの解析」をご覧ください。


documentation. Copyright (c)2002-2003 Politecnico di Torino.
2005 translated by Telebusiness,Inc.
 All rights reserved.