1

pcap_loop関数が呼び出された後、最初のパケットをキャプチャするために数秒待たなければならないのはなぜですか?

void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);

int main(int argc, char * argv[])
{
    pcap_t * handle;
    char dev_name[] = "en0";
    char err_buf[PCAP_ERRBUF_SIZE];

    handle = pcap_open_live(dev_name, 4096, 1, 0, err_buf);

    if (handle == NULL) {
        fprintf(stderr, "Couldn't open device %s: %s\n" , dev_name , err_buf);
        exit(1);
    }

    pcap_loop(handle, 1, print_packet, NULL);
    pcap_close(handle);

    exit(0);
}

void print_packet(u_char * args, const struct pcap_pkthdr * hdr, const u_char * buff)
{
    /* ... */
}
4

1 に答える 1

2

pcap_open_liveドキュメントを読んで問題を見つけました:

pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf)

[...] to_msは、読み取りタイムアウトをミリ秒単位で指定します。読み取りタイムアウトは、パケットが検出されたときに読み取りが必ずしもすぐに返されるとは限らないが、1回の操作でより多くのパケットが到着し、OSカーネルから複数のパケットを読み取ることができるように一定時間待機するように調整するために使用されます。すべてのプラットフォームが読み取りタイムアウトをサポートしているわけではありません。そうでないプラットフォームでは、読み取りタイムアウトは無視されます。読み取りタイムアウトをサポートするプラットフォームでto_msの値がゼロの場合、読み取りは永久に待機し、タイムアウトなしで十分なパケットが到着できるようになります。[...]

ソース

于 2012-06-22T15:01:03.747 に答える