【发布时间】:2012-02-27 06:10:28
【问题描述】:
我正在编写一个 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端口80 英寸)。这给出了很多“1514”的数据包长度,我认为这与 1500 的 MTU 值有关,但是总数仍然太低。
【问题讨论】:
-
如果您通过 HTTP 下载内容,请确保 HTTP 客户端不使用压缩。
-
int main(char** arcv, int argc){休斯顿,我们遇到了问题! -
我看到了两个常规选项。要么你得到错误的数据包,要么错误的大小。要检查数据包,您可以打印源/目标端口 - 您是否将 80 作为 bot 源和目标端口?要检查大小,请更改程序以打印每个大小 - 您应该会看到大量返回的数据包(源端口 80),大小约为 1500。
-
@ugoren 谢谢,我很确定我得到了正确的数据包——当我发送请求时有很多输出,而之前或之后什么都没有。为什么你期望大小在 1500 左右?我的数据包大小大多要小得多(例如,大约 50-60 字节)
-
也许您只是从客户端获取数据包到服务器?这些主要是 ACK,因此它们的大小为 50-60。来自服务器的数据包尽可能大,这通常意味着 1500 字节(以太网接口的 MTU),有时或多或少(但不少于数百字节)。
标签: c network-programming pcap libpcap