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.