c语言winpcap编程,c语言Winpcap编程结构并接收解析arp包

本文介绍了如何使用C语言通过Winpcap库来构造和解析ARP包。首先讲解了ARP包的结构,然后介绍了Winpcap的几个关键函数,如pcap_findalldevs、pcap_open_live等。接着展示了如何构造ARP请求和应答包,以及如何发送和接收ARP数据包。最后,阐述了如何捕获和解析网络中的ARP数据包,涉及到了pcap_setfilter函数的应用。
摘要由CSDN通过智能技术生成

c语言Winpcap编程构造并接收解析arp包

/*

程序功能:

1、构造arp包,并发送。程序参数顺序:源IP、目的IP、mac地址、flag

2、获取网络中的ARP数据包,解析数据包的内容。程序参数:日志文件名

winpacp中文技术文档(基本是英文的):http://www.ferrisxu.com/WinPcap/html/index.html

*/

一、构造arp包

在构造之前先了解一下arp包的结构,先从网上找了张图

202954420.jpg

从图中可以看出以太网首部占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中是怎么定义的

202954421.png

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中宏定义的,如下图

202954422.png

这个错误缓冲区用来做什么呢?在函数错误返回时(返回值为-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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值