pcap_next虽然也是通过网口获取数据包,但是只要抓取了一个就会返回,假如想持续不停抓包,当然可以while(1)里持续进行,但是显然有些难看
while(1){
const u_char* pktStr = pcap_next(p, &pkthdr);
if (!pktStr){
printf(“Cannot capture pkt!\n”);
exit(1);
}
printf(“Capture packet length: %d\n”, pkthdr.len);
}
但是libpcap提供了核心函数pcap_loop直接可以实现这一目的
int
pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
参数cnt设定了需要抓取的数据包的个数,抓了cnt个之后,pcap_loop就会返回,显然如果cnt为1的时候,跟pcap_next的效果是一样的;但大部分都会设置为-1,这样就会一直持续抓包,跟上面的while(1)情况类似
参数callback是一个用户层的回调函数,数据包抓取了之后就交给callback来处理,任人宰割
typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,const u_char *data);
user参数传递了用户自定义一些数据,是pcap_loop的最后一个参数,进而传递给回调函数
h是收到数据包pcap_pkthdr类型的指针
data是真正数据包的内容
因此可以直接调用pcap_loop来持续抓包,然后在回调函数里,尽情地挖掘你想要的数据包信息吧!!!
[lihui@localhost ~]$ cat loop.c
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
int current_pkt = 0;
void lihui_callback(u_char *u, const struct pcap_pkthdr *hdr, const u_char *data){
++current_pkt;
printf(“The %d packet length: %d\n”, current_pkt, hdr->len);
}
int main(){
char ebuf[PCAP_ERRBUF_SIZE];
char *device;
int pktlen = 65535;
int misc = 1;
int timeout = 0;
device = pcap_lookupdev(ebuf);
if (device)
printf(“Capture Nic: %s\n”, device);
else {
printf(“Nic Error: %s\n”, ebuf);
exit(1);
}
pcap_t *p = pcap_open_live(device, pktlen, misc, timeout, ebuf);
/*
struct pcap_pkthdr pkthdr;
const u_char* pktStr = pcap_next(p, &pkthdr);
if (!pktStr){
printf(“Cannot capture pkt!\n”);
exit(1);
}
printf(“Capture packet length: %d\n”, pkthdr.len);
*/
printf(“Capture pkt start:\n”);
pcap_loop(p, -1, (pcap_handler)lihui_callback, (u_char *)p);
pcap_close(p);
return 0;
}
涂鸦智能服务端开发工作总结
- 417 views
字节跳动测开面试经历
- 521 views
曹操专车中台服务测试工作总结
- 1,042 views
华为云计算网络服务工作总结
- 1,211 views
网易云计算工作总结
- 1,068 views
水岸风堤
- 624 views
离开无锡新的开始
- 1,057 views
KafkaTemplate发送KafKa消息
- 13,042 views
MongoTemplate的对象更新操作
- 9,383 views
Dubbo QOS服务
- 7,800 views
Spring:MyBatis框架@MapperScan注解流程和疑惑
- 7,175 views
RedisTemplate操作Redis数据:List类型
- 6,369 views
Ant Design Pro:和SpringBoot服务端交互
- 5,599 views
RedisTemplate操作Redis数据:ZSet类型
- 5,120 views
《Thinking in Java》5th Edition电子书
- 4,833 views
VMware ESXi配置多块物理网卡
- 4,575 views
Ant Design Pro:启动以及新增页面
- 4,546 views
Compiler
14
CPU
7
Distributed
3
Docker/Kubernetes
8
Dubbo
9
ElasticSearch
1
HTTP
9
Java
73
Kafka
3
LeetCode
49
Libnids
5
Libpcap
5
Life
66
Linux
30
Linux C
53
Middleware
7
MongoDB
12
Music
27
MySQL
11
Networking
71
OpenStack
53
Performance
21
Perl
13
PHP
6
Python
44
Redis
14
RegularExpression
4
Shell
11
Spring
34
TCP/IP
4
Tempest
10
Testing
10
Tool
31
Virtualization
15
Web
14
2024年3月
(
1
)
2023年11月
(
1
)
2023年2月
(
1
)
2022年6月
(
1
)
2022年3月
(
1
)
2021年8月
(
2
)
2021年7月
(
4
)
2021年6月
(
1
)
2021年4月
(
1
)
2021年3月
(
1
)
2021年2月
(
1
)
2021年1月
(
4
)
2020年11月
(
1
)
2020年9月
(
2
)
2020年8月
(
3
)
2020年7月
(
7
)
2020年4月
(
1
)
2020年3月
(
1
)
2020年2月
(
1
)
2020年1月
(
5
)
2019年12月
(
4
)
2019年11月
(
13
)
2019年10月
(
8
)
2019年9月
(
7
)
2019年8月
(
6
)
2019年7月
(
3
)
2019年6月
(
4
)
2019年5月
(
6
)
2019年4月
(
6
)
2019年3月
(
2
)
2019年2月
(
6
)
2019年1月
(
4
)
2018年12月
(
6
)
2018年11月
(
9
)
2018年10月
(
3
)
2018年9月
(
3
)
2018年8月
(
11
)
2018年7月
(
11
)
2018年6月
(
13
)
2018年5月
(
17
)
2018年4月
(
24
)
2018年3月
(
22
)
2018年2月
(
7
)
2018年1月
(
3
)
2017年12月
(
3
)
2017年11月
(
3
)
2017年10月
(
7
)
2017年9月
(
1
)
2017年8月
(
5
)
2017年7月
(
2
)
2017年6月
(
1
)
2017年5月
(
1
)
2017年4月
(
4
)
2017年3月
(
7
)
2017年2月
(
13
)
2017年1月
(
12
)
2016年12月
(
17
)
2016年11月
(
10
)
2016年10月
(
19
)
2016年9月
(
8
)
2016年8月
(
2
)
2016年7月
(
7
)
2016年5月
(
5
)
2016年4月
(
7
)
2016年3月
(
5
)
2016年2月
(
4
)
2016年1月
(
3
)
2015年12月
(
2
)
2015年11月
(
12
)
2015年10月
(
9
)
2015年9月
(
6
)
2015年8月
(
9
)
2015年7月
(
16
)
2015年6月
(
18
)
2015年5月
(
12
)
2015年4月
(
12
)
2015年3月
(
20
)
2015年2月
(
34
)
2015年1月
(
52
)
2014年12月
(
37
)
2014年11月
(
88
)