EN JA
PCAP_LOOP(3)
PCAP_LOOP(3) FreeBSD Library Functions Manual PCAP_LOOP(3)

名称

pcap_loop, pcap_dispatch -ライブキャプチャ (捕獲) または savefile からパケットを処理する

書式


#include <pcap/pcap.h>


typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
const u_char *bytes);


int pcap_loop(pcap_t *p, int cnt,
pcap_handler callback, u_char *user);
int pcap_dispatch(pcap_t *p, int cnt,
pcap_handler callback, u_char *user);

解説

pcap_loop() は、 cnt パケットが処理されるまで、ライブキャプチャ (捕獲) または ``savefile'' からパケットを処理するか、``savefile'' から読み込むとき、``savefile'' の終りに到達するか、 pcap_breakloop() が呼び出されるか、またはエラーが発生します。ライブ読み込みのタイムアウトが起こるとき、返り ませんcnt の-1 または 0 の値は、無限で同等ですので、別の終わりの状態が起こるまで、パケットは、処理されます。

pcap_dispatch() は、 cnt パケットが処理されるか、ライブキャプチャを行うとき、パケットの現在のバッファフルの終りに到達するか、``savefile'' から読み込むとき、 ``savefile'' の終りに到達するか、 pcap_breakloop() が呼び出されるか、またはエラーが起こるまで、ライブキャプチャ (捕獲) または ``savefile'' からパケットを処理します。したがって、ライブキャプチャを行うとき、 cnt は、返る前に処理するパケットの最大数ですが、最小数ではありません。ライブキャプチャを読み込むとき、 1 度に 1 つのパケットのバッファフルが読み込まれるので、 cnt パケットが処理されるより少ないです。 cnt のための-1 または 0 の値によって、ライブキャプチャを読み込むとき、 1 つのバッファに受信されるすべてのパケットは、処理され、 ``savefile'' を読み込むとき、ファイルのすべてのパケットは、処理されます。

(libpcap の古いバージョンでは、 cnt が 0 であったときに、振る舞いは、未定義でした。異なったプラットフォームとデバイスは、異なって振る舞うので、 libpcap の古いバージョンで動作しなければならないコードは、 cnt の値として、-1、0 でない、を使用するべきです。)

callback は、3 つの引数を付けて呼び出される pcap_handler ルーチンを指定します: user 引数で pcap_loop() または pcap_dispatch() に渡される u_char ポインタ、パケットのタイムスタンプと長さを指す const struct pcap_pkthdr ポインタ、とパケットからの (コールバックルーチンに渡される struct pcap_pkthdr ポインタで与えられる) 最初の caplen バイトを指す const u_char ポインタです。 struct pcap_pkthdr とパケットデータは、コールバックルーチンによって解放することができず、コールバックルーチンが返った後に有効であることは保証されません。コードがコールバックの後に有効であるために、それらを必要とするなら、それらのコピーを行わなければなりません。

戻り値

pcap_loop() は、 cnt が使い果たされるか、または ``savefile'' から読み込まれるとき、これ以上のパケットが利用可能ではないなら、0 が返されます。エラーが起こったなら、-1 を返し、任意のパケットが処理される前に pcap_breakloop() への呼び出しのためにループが終了したなら、-2 を返します。ライブ読み込みタイムアウトが起こるとき、返り ません 。代わりに、より多くのパケットを読み込むことを試みます。

pcap_dispatch() は、成功すれば処理されたパケットの数を返します。パケットがライブキャプチャから読み込まれなかったなら (例えば、パケットフィルタを渡さなかったので、それらが捨てられたか、任意のパケットも到着する前に開始される読み込みタイムアウトをサポートするプラットフォームで、任意のパケットが到達する前にタイムアウトの期限が切れなら、またはキャプチャデバイスのためのファイル記述子が非フロッキングモードであり、任意のパケットが読み込みで利用可能でなかったなら)、またはパケットが ``savefile'' で、それ以上で利用可能でないなら、これを 0 とすることができます。それは、エラーが起こったなら、-1 を返すか、またはループが、任意のパケットが処理される前に、 pcap_breakloop() への呼び出しのため終了したなら、-2 を返します。利用者のアプリケーションが pcap_breakloop() を使用するなら、ただ返り値 < 0 であるかチェックするのではなく、-1 と-2 のために明白なチェックを確認します。

-1 が返されるなら、 pcap_geterr() または pcap_perror() は、取って来るか、またはエラーテキストを表示する引数として p を付けて呼び出されます。

関連項目

pcap(3), pcap_geterr(3), pcap_breakloop(3)
24 December 2008