gpt4 book ai didi

无法使用 libpcap 捕获数据包

转载 作者:行者123 更新时间:2023-11-30 16:18:17 25 4
gpt4 key购买 nike

我是 libpcap 的新手。

我正在使用这个库来捕获数据包,下面是我编写的捕获数据包的代码。

我正在窃听的接口(interface)总是充满arp数据包,因此总是有数据包到达该接口(interface)。但我无法窃听这些数据包。接口(interface)已启动并正在运行。我在 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。

关于无法使用 libpcap 捕获数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55964839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com