用到一个pcap中的数据类型:pcap_pkthdr。
struct pcap_pkthdr
{
struct timeval ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
ts:时间戳
cpalen:当前分组的长度
len:数据包的长度
caplen——真正实际捕获的包的长度
len——这个包的长度
因为在某些情况下你不能保证捕获的包是完整的,例如一个包长1480,但是你捕获到1000的时候,可能因为某些原因就中止捕获了,所以caplen是记录实际捕获的包长,也就是1000,而len就是1480。
然后做一个简单的抓包,得到包的长度。
#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE];
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
printf("Error in pcap_findalldevs: %s\n", errbuf);
exit(EXIT_FAILURE);
}
printf("Device name: %s\n", alldevs->name);
printf("Descripetion: %s\n", alldevs->description);
pcap_t *handler;
handler = pcap_open_live(alldevs[0].name, PCAP_ERRBUF_SIZE, 1, 100, errbuf);
if(handler == NULL)
{
printf("open fail\n");
return -1;
}
struct pcap_pkthdr pkhdr; //packet information
while(1)
{
const unsigned char *packet = pcap_next(handler, &pkhdr); //get a bag
if(packet == NULL)
{
pcap_close(handler);
break;
}
//open packet information
if(pkhdr.len != pkhdr.caplen) //测试输出当抓包的长度和数据包的长度不想等的时候输出
{
printf("Different\n");
printf("Packet's length is %d\n", pkhdr.len);
printf("Packet's caplen is %d\n", pkhdr.caplen);
}
printf("Packet's length is %d\n", pkhdr.len);
printf("Packet's caplen is %d\n", pkhdr.caplen);
}
pcap_freealldevs(alldevs);
return 0;
}
然后,执行运行的操作,当然不能直接使用编译器的run的功能,通过终端操作sudo才可以,这是为了安全期间,避免写了错误的代码导致电脑崩溃之类的。
首先 ,cd到对应的目录之下,可以通过ls来看当前目录下的文件。
然后,gcc执行main.c的文件。
最后,sudo操作。
然后,就可以看到数据包的长度了,当然,我这里并没有加上“Different”。
如果,发现没有输出,可以试着找到一个网站,然后点进去刷新一下,你的终端就会有反馈了。