首先,利用终端配置好gcc的环境,然后还要配置上libpcap的环境,以上通过相关文章进行学习。
<pcap.h>
首先,先能得到数据包的包的长度。这里用到的头文件是pcap.h,其中用到的有pcap_if_t数据类型。
pcap_if_t 保存网卡基本信息的类型。通常用指针来使用,pcap_if_t *alldevs。
当然,很多时候pcap_if_t可以用pcap_if进行替代。
struct pcap_if
{
struct pcap_if *next;//指向下一个网卡
char *name;//网卡的标识符,唯一识别一个网卡
char *description;//用来描述网卡
struct pcap_addr*address;//网卡的地址,包括IP地址,网络掩码,广播地址等,类型中的成员变量在后面会写到
bpf_u_int32 flags;//接口标志
}
然后写一个简单的测试。
#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);
}
for(; device->name != NULL; device = device->next)
{
printf("Device name: %s\n", device->name);
printf("Descripetion: %s\n", device->description);
}
pcap_freealldevs(alldevs);
return 0;
}
其中,PCAP_ERRBUF_SIZE恒定为256,可以认为#define PCAP_ERRBUF_SIZE 256 。
pcap_findalldevs(pcap_if_t **, char *) 函数
函数pcap_findalldevs的作用是获取网络设备,pcap_open_live要打开的网卡名称, 在linux中一般都选第一块网卡。
功能:列出当前所有可用的网络设备(网卡)
所在头文件:pcap.h
参数说明: pcap_if_t ** alldevsp 指向pcap_if_t结构列表的指针的地址。实际使用时,声明一个pcap_if_t结构的指针(pcap_if_t *alldevsp),然后把该地址作为参数传入即可(&alldevs)。
char * errbuf 错误缓冲区,要求长度至少为PCAP_ERRBUF_SIZE字节。
返回值: -1:出错,将会向错误缓冲中填充错误信息,错误信息为ASCII码,可以直接打印出来。
返回值: 0:正确返回,可以使用alldevs访问所有网络硬件。
另外,EXIT_FAILURE 可以看作#define EXIT_FAILURE 1。
pcap_freealldevs(pcap_if_t *)函数
pcap_freealldevs(alldevs);
功能:释放所指的设备
参数:alldevs指向设备的pcap_if_t类型
无返回值
如何执行/使用
在终端cd到你的“main.c”文件的当前目录之下,然后执行 :
gcc main.c -o pcap -lpcap
然后再用sudo执行:
sudo ./pcap
然后就可以在终端中看到你的包的信息了。
如上图所示。