[英]Cannot capture the packet using libpcap
我是一个新的使用libpcap。
我正在使用这个库捕获数据包和我写入捕获数据包的代码。
我正在点击的接口总是充满了arp数据包,所以始终有数据包进入接口。但是我无法点击这些数据包。 界面已启动并正在运行。 我在pcap_open_live函数上没有错误。
代码在C中。我在FreeBSD10机器上运行此代码32位。
void captutre_packet(char* ifname , int snaplen) {
char ebuf[PCAP_ERRBUF_SIZE];
int pflag = 0;/*promiscuous mode*/
snaplen = 100;
pcap_t* pcap = pcap_open_live(ifname, snaplen, !pflag , 0, ebuf);
if(pcap!=NULL) {
printf("pcap_open_live for %s \n" ,ifname );
}
int fd = pcap_get_selectable_fd(pcap);
pcap_setnonblock(pcap, 1, ebuf);
fd_set fds;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 3;
tv.tv_usec = 0;
int retval = select(fd + 1, &fds, NULL, NULL, &tv);
if (retval == -1)
perror("select()");
else if (retval) {
printf("Data is available now.\n");
printf("calling pcap_dispatch \n");
pcap_dispatch(pcap , -1 , (pcap_handler) callback , NULL);
}
else
printf("No data within 3 seconds.\n");
}
void
callback(const char *unused, struct pcap_pkthdr *h, uint8_t *packet)
{
printf("got some packet \n");
}
我总是得到retval为0,这是超时。 我不知道幕后发生了什么我遵循教程,他们也完全一样,我不知道我错过了什么。
我还想了解一旦接收到以太网层的数据包如何被复制到这个打开的bpf套接字/设备(使用pcap_open_live)以及如何将缓冲区从内核空间复制到用户空间?
我们可以在数据包中使用多长时间直到内核消耗或拒绝数据包?
pcap_open_live()
调用提供0作为数据包缓冲区超时值(第四个参数)。 libpcap没有指定0的值意味着什么,因为在不同的操作系统上,不同的数据包捕获机制会以不同的方式处理该值。
在使用BPF的系统上,例如BSD和macOS,它意味着“在提供数据包之前等待数据包缓冲区完全满。如果数据包缓冲区很大(在FreeBSD上默认为256K左右),并且数据包很小(对于ARP数据包为60个字节),缓冲区可能需要花费大量时间来填充 - 比您传递给select()
的超时时间更长。
最好将超时值设置在100毫秒到1秒之间,因此传递的参数介于100和1000之间,而不是0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.