gpt4 book ai didi

c - pcap 数据包长度值似乎不正确

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:48 24 4
gpt4 key购买 nike

我正在编写一个 C 应用程序,它使用 pcap 库来记录通过网卡的数据量(匹配各种数据包过滤器)。我得到的值似乎太低而不正确,但我不确定我做错了什么。

下面的测试代码表现出相同的行为(为清楚起见省略了错误检查):

#include <stdio.h>
#include <pcap.h>

static int total=0;
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data){
total += header->len;
printf("%d\n", total);
}

int main(){
char errbuf[1024];

pcap_t *adhandle = pcap_open_live("en1", 65535, 0, 0, errbuf);
pcap_setnonblock(adhandle, 1, errbuf);
struct bpf_program fcode;
pcap_compile(adhandle, &fcode, "port 80", 1, 0);
pcap_setfilter(adhandle, &fcode);

while(1){
pcap_dispatch(adhandle, -1, packet_handler, NULL);
sleep(1);
}
return 0;
}

我在 OSX 上工作,用 gcc 编译,我试过通过 wi-fi 和有线以太网下载。我希望上面的代码打印出与过滤器匹配的字节数(在本例中为所有 HTTP 流量),但是当我下载一个大小为 4,357,017 字节的测试文件时,我得到的值仅为 95,133。我的测试文件是一个 zip 存档,所以我认为 HTTP 压缩不能解释差异。

更新:我修改了代码以打印出每个数据包的大小以及运行总数,并且还仅报告传入的数据包(将过滤器更改为“src port 80”)。这给出了很多“1514”的数据包长度,我认为这与 1500 的 MTU 值有关,但总数仍然太低。

最佳答案

这里不能保证您的程序会看到所有数据包;如果它没有看到它们,就无法对它们进行计数,在这种情况下,捕获的数据包长度总和小于传输的数据量也就不足为奇了。

首先,你不应该使用非阻塞模式,除非你的程序做的不仅仅是捕获数据包 - 轮询在这里工作得不好,它可能会更糟。使用您的代码,如果在一秒钟内到达的数据包超出了缓冲区的容量,系统将耗尽 BPF 缓冲区空间,这意味着数据包将被丢弃,您的程序将永远看不到它们,因此不会对它们进行计数。在 Lion 之前,默认缓冲区大小约为 32K 左右,这意味着系统很有可能会用完 BPF 缓冲区空间; Lion 采用 libpcap 1.1 更改,使 BPF 系统的默认缓冲区大小为 512K,因此发生这种情况的可能性较小,但您仍然不应该使用非阻塞模式,除非您确实需要它。

此外,你不应该在 Snow Leopard 上使用非阻塞模式根本,因为 Snow Leopard 的 BPF 内核代码中存在一个错误(错误的 FreeBSD 版本是 PR 143855 ) ;它不存在于 Leopard 或之前(它是在修复 Snow Leopard 中修复的错误时引入的),它在 Lion 中已修复。

所以我要做的第一件事就是摆脱 pcap_setnonblock(adhandle, 1, errbuf); 调用和 sleep(1); 调用,以便您的程序尽可能快地处理数据包。

此外,如果它不必在 Leopard 上运行(Leopard 有不支持 pcap_create()pcap_activate() 的旧版本的 libpcap ),我会通过以下操作将缓冲区大小提高到 512K(为清楚起见,删除了错误检查):

adhandle = pcap_create("en1", errbuf);
pcap_set_buffer_size(adhandle, 524288);
pcap_activate(adhandle);

最后,我会让你的程序以某种方式提供一种方法来告知何时停止捕获,并在它停止时调用 pcap_stats() 并报告丢弃的数据包数量,所以您可以确定它是否丢弃了任何数据包。

关于c - pcap 数据包长度值似乎不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9148749/

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