基于Liunx与C语言的网络抓包学习(简单抓包之数据包的长度)

   用到一个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才可以,这是为了安全期间,避免写了错误的代码导致电脑崩溃之类的。

基于Liunx与C语言的网络抓包学习(简单抓包之数据包的长度)

  首先 ,cd到对应的目录之下,可以通过ls来看当前目录下的文件。

  然后,gcc执行main.c的文件。

  最后,sudo操作。

  然后,就可以看到数据包的长度了,当然,我这里并没有加上“Different”。

   如果,发现没有输出,可以试着找到一个网站,然后点进去刷新一下,你的终端就会有反馈了。

上一篇:libpcap使用


下一篇:快速幂讲解(很重要的算法)