为什么在调用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)
{
/* ... */
}
答案 0 :(得分:1)
我通过阅读pcap_open_live
文档找到了问题:
pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf)
[...] to_ms指定读取超时(以毫秒为单位)。阅读 timeout用于安排读取不一定在看到数据包时立即返回, 但它会等待一段时间以允许更多数据包到达并读取多个数据包 来自OS内核的一次操作。并非所有平台都支持读取超时;在平台上 不要忽略读取超时。在支持读取时间的平台上,to_ms为零值 - out,将导致读取永远等待,以允许足够的数据包到达,没有超时。 [...]