libpcap的使用

libpcap的基本使用

1.获取网络接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
char *pcap_lookupdev(char *error_buffer);//获取本地网络接口(返回网络接口的名称)
int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);//查找本地所有的网络接口
typedef struct pcap_if pcap_if_t;
struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};
struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr; /* address */
struct sockaddr *netmask; /* netmask for that address */
struct sockaddr *broadaddr; /* broadcast address for that address */
struct sockaddr *dstaddr; /* P2P destination address for that address */
};
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) */
};//抓到的包的结构
int pcap_loop(handler,10,capture_handler,NULL);
char *inet_ntoa(struct in_addr *addr);//该函数返回的指针指向的地址空间是静态分配的,因此每次调用此函数后,后面的结果都会对上一次的结果进行覆盖

2.打开一个网络接口

1
2
3
4
5
pcap_t*  pcap_open_live(char *device,int snaplen,int packet_count_limit,int timeout_limit,char *error_buffer);//打开一个网卡获得一个抓包句柄
//device
//snaplen
//packet_count_limit 最大抓取的包的数量
//int timeout_limit 设置包从内核缓冲区拷贝到用户区所等待的时间

3.编译过滤条件

1
2
3
4
5
int pcap_compile(pcap_t *handler, struct bpf_program *fp, char *exp, int optimize, bpf_u_int32 netmask);	//编一个过滤条件
//handler 打开的网卡句柄
//fp 存储过滤条件指针
//optimize 是否进行优化
//netmask 网络地址

4.设置过滤器

1
2
3
int pcap_setfilter(pcap_t *p, struct bpf_program *fp);	//设置过滤器
//p 打开网卡的句柄
//fp设置的过滤表达式

5.获取包信息

1
2
3
4
u_char *pcap_next(device,&packet);
int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user);
typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,const u_char *bytes);
//获取一个数据包

libpcap的使用
https://dreamaccount.github.io/2022/07/08/libpcap的使用/
作者
404NotFound
发布于
2022年7月8日
许可协议