c语言Winpcap编程构造并接收解析arp包
/*
程序功能:
1、构造arp包,并发送。程序参数顺序:源IP、目的IP、mac地址、flag
2、获取网络中的ARP数据包,解析数据包的内容。程序参数:日志文件名
winpacp中文技术文档(基本是英文的):http://www.ferrisxu.com/WinPcap/html/index.html
*/
一、构造arp包
在构造之前先了解一下arp包的结构,先从网上找了张图
从图中可以看出以太网首部占14字节,以太网ARP字段占28字节。其中op字段为操作类型,1表示ARP请求、2表示ARP应答
再介绍几个要用到的pcap函数
int pcap_findalldevs ( pcap_if_t ** alldevsp, char * errbuf)
函数功能:列出当前所有可用的网络设备(网卡),将设备信息存入pcap_if_t结构列表中
参数:1、alldevsp 指向pcap_if_t结构列表的指针的地址(注意这里是pcap_if_t指针的地址,而不是pcap_if_t结构的地址)
有些地方这里可能会写pcap_if结构,其实pcap_if和pcap_if_t就是同一个东西,我们来看看在pcap.h中是怎么定义的
pcap_if结构体成员:
Struct pcap_if {
struct pcap_if *next; //指向下一个链表成员
char *name; //网卡名称
chat *description; //网卡描述信息
struct pcap_addr address;
u_int flags; //接口标志
}
2、errbuf 错误缓冲区,要求长度至少为PCAP_ERRBUF_SIZE 字节,那么PCAP_ERRBUF_SIZE是多大呢
这在pcap.h中宏定义的,如下图
这个错误缓冲区用来做什么呢?在函数错误返回时(返回值为-1)会向错误缓冲中填充错误信息,错误信息为可打印ASCII码
函数正确时返回0
2、pcap_t * pcap_open_live ( char * device, int snaplen, int promisc,int to_ms, char * errbuf )
函数功能:在网络中打开一个活动的捕获
函数的返回值为一个结构体指针pcap_t即为struct pcap。pcap_t结构体有点长就不做说明了,里面就是捕获句柄的一些信息
参数:
device 设备名
snaplen 单包最大捕捉字节数(若数据包大于snaplen,只有前面snaplen字节大小的数据被捕获)
promisc 混杂模式(即使该参数是false,也可能由其他原因导致网络接口为混杂模式)
to_ms 指定毫秒级读超时(当一个数据包被发现时,并不一定立即返回数据包,它会等待一段时间,允许一个操作从系统内核读取多个数据 包。不是所有的平台都支持读超时,在不支持的平台上读超时会被忽略。)
errbuf 用于返回错误或警告信息
3、void pcap_close ( pcap_t *p )
关闭pcap_open_live()获取的包捕获句柄,释放相关资源
源码:
1 /*
2 构造并发送ARP包3 2015年6月24日15:44:214 blog:http://www.cnblogs.com/wd1001/
5 */
6 #include
7 #include
8 #include
9
10 #pragma comment(lib, "wpcap.lib")
11 #pragma comment(lib, "wsock32.lib")
12 #pragma comment(lib, "ws2_32.lib")
13
14 main(int argc, char **argv)15 {16 u_char packet[100];17 pcap_if_t *alldevs;18 pcap_if_t *d;19 intinum;20 int i=0,j,k,temp[3];21 pcap_t *adhandle;22 charerrbuf[PCAP_ERRBUF_SIZE];23 /*获取设备列表*/
24
25 if (argc != 5)//argc==5,及程序后面有四个参数
26 {27 printf("usage: %s inerface", argv[0]);28 return -1;29 }30
31
32 if (pcap_finda