公司业务需要,需要做一个libpcap项目抓包流量分析服务,网上关于此类项目不多,因此自己实现了一个
关于libpcap的一些基础部分这里不再陈诉了
注 : 本文因为频繁使用malloc的操作,为了防止内存碎片,均采用的jemmloc库
前提数据结构[ 注 : 下面的抄袭的nginx的ngx_string , 其实说实话,关于此类数据结构,实用性上,redis的sds实现的较为全面,数据接口多,不用你再重复造轮子,我只是个人喜欢nginx的小巧和自定义的灵活,因此拿来使用了,如果各位自己实现,建议使用redis的sds世界使用]
typedef mini_str_s { int len; u_char* data; }mini_str_t;
#define mini_string(str) { sizeof(str) - 1, (u_char *) str }
#define ngx_str_set(str, text) (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text
1 : 基本数据结构定义
定义每个采集网卡数据结构
typedef struct cap_ctx_s{
pcap_t* handle; // pcap_t结构指针
mini_str_t device; //网卡名称 : “eth0”“vlan0”
char* errbuf; //错误消息
mini_str_t filter; //过滤表达式
}cap_ctx_t ; //采集数据结构
typedef struct cap_array_s{
zlist_t* context; //存放cap_ctx_t的list
int capnums; // cap_ctx_t采集器的数量
}cap_array_t;
2 : 数据操作
2.1 初始化一个采集端口
// 参数 |

本文介绍了使用libpcap进行多网卡抓包流量分析服务的实现,包括数据结构设计、初始化及操作过程。通过线程池进行多网卡并发采集,实现了高效的数据捕获。此外,文中提到了libpcap的性能瓶颈以及如何通过pfring的mmap方案优化达到1.2G/s的采集速度,并建议在更高带宽场景下使用netmap或pfring的0拷贝技术。
最低0.47元/天 解锁文章
1880

被折叠的 条评论
为什么被折叠?



