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;
}
Mysterious:分布式压测平台化实现
- 72 views
涂鸦智能服务端开发工作总结
- 431 views
字节跳动测开面试经历
- 538 views
曹操专车中台服务测试工作总结
- 1,051 views
华为云计算网络服务工作总结
- 1,220 views
网易云计算工作总结
- 1,081 views
水岸风堤
- 633 views
离开无锡新的开始
- 1,079 views
KafkaTemplate发送KafKa消息
- 13,069 views
MongoTemplate的对象更新操作
- 9,400 views
Dubbo QOS服务
- 7,816 views
Spring:MyBatis框架@MapperScan注解流程和疑惑
- 7,201 views
RedisTemplate操作Redis数据:List类型
- 6,390 views
Ant Design Pro:和SpringBoot服务端交互
- 5,650 views
RedisTemplate操作Redis数据:ZSet类型
- 5,132 views
《Thinking in Java》5th Edition电子书
- 4,870 views
VMware ESXi配置多块物理网卡
- 4,600 views
Ant Design Pro:启动以及新增页面
- 4,565 views
libpcap核心pcap_loop
- 4,331 views
Uber H3算法封装成JAR包以及常用API调用
- 4,169 views
Kubernetes集群:Dashboard插件各种坑
- 4,113 views
RedisTemplate操作Redis数据:Set类型
- 4,014 views
VxLAN和VTEP
- 3,901 views
RedisTemplate操作Redis数据:Hash类型
- 3,692 views
MongoDB实现多表连接查询
- 3,579 views
JaCoCo:全量代码覆盖率统计
- 3,452 views
libpcap读取本地pcap文件
- 3,377 views
Telnet调试Dubbo接口,参数里含有枚举类的执行异常解决
- 3,245 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