C语言实现TcpDump

一、

在 C 语言中实现 TCP 抓包功能,通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库,它提供了捕获网络数据包的接口。
libpcap 是一个广泛使用的 C 语言库,用于捕获和过滤网络数据包。它提供了一个通用接口,用于访问数据链路层的协议,使用户能够在各种平台上实现网络流量捕获功能。

二、准备

安装 libpcap:在 Linux 系统中,可以使用以下命令安装

sudo apt-get install libpcap-dev

或者
下载、编译源码

git clone https://github.com/the-tcpdump-group/libpcap

可以查看官方文档

https://www.tcpdump.org/

三、代码

#include <stdio.h>
#include <stdlib.h>
#include <pcap/pcap.h>//头文件包含#define SNAP_LEN 65535
#define PROMISC  1
#define TIMEOUT  1000             // ms
#define BUFSIZE  4 * 1024 * 1024  // 4MBtypedef struct {pcap_dumper_t *dumper;  // 用于保存数据包的句柄time_t start_time;       // 记录当前文件的起始时间long written_bytes;      // 当前文件已写入的字节数int file_index;          // 文件索引,用于防止同一秒生成两个文件
} capture_context_t;//抓到包后具体的处理,根据带入的参数和自己需要的规则进行编写功能
void packet_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) {capture_context_t *ctx = (capture_context_t *)user;time_t now = time(NULL);long packet_size = h->caplen;// 更新写入字节数ctx->written_bytes += packet_size;// 计算是否需要切换文件if (difftime(now, ctx->start_time) >= MAX_DURATION_SEC ||ctx->written_bytes >= MAX_FILE_SIZE) {// 关闭旧文件pcap_dump_close(ctx->dumper);// 打开新文件char filename[256];ctx->file_index += 1;generate_filename(filename, sizeof(filename), ctx->file_index);ctx->dumper = pcap_dump_open(ctx->handle, filename);ctx->start_time = now;ctx->written_bytes = 0;printf("🆕 Switched to new file: %s\n", filename);}// 写入当前包pcap_dump((u_char *)ctx->dumper, h, bytes);
}int main() {char errbuf[PCAP_ERRBUF_SIZE];//存放错误打印pcap_t *handle;pcap_dumper_t *dumper;struct bpf_program fp;bpf_u_int32 net = 0, mask = 0;//查找当前系统中一个默认的抓包网络设备名,需要确认是否有权限const char *dev = pcap_lookupdev(errbuf);if (!dev) {fprintf(stderr, "Device not found: %s\n", errbuf);return 1;}const char *filter_exp = "tcp port 80"; // 设置过滤器的规则,可以换成 "udp", "ip", "host 192.168.1.1", 等等const char *outfile = "output.pcap";    // 输出文件printf("Using device: %s\n", dev);// 获取网络地址 & 掩码(用于过滤器编译)if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {fprintf(stderr, " Could not get netmask for %s: %s\n", dev, errbuf);net = 0;mask = 0;}//创建并配置抓包句柄handle = pcap_create(dev, errbuf);if (!handle) {fprintf(stderr, " pcap_create failed: %s\n", errbuf);return 1;}//设置抓包长度pcap_set_snaplen(handle, SNAP_LEN);//混杂模式,当网络接口处于混杂模式时,它会接收所有经过的数据包,而不仅仅是发送给它的包。pcap_set_promisc(handle, PROMISC);//设置捕获数据包的超时时间,以毫秒为单位,表示在没有接收到数据包的情况下,等待的最长时间pcap_set_timeout(handle, TIMEOUT);//设置缓冲区大小,增大缓冲区可以提高捕获性能,尤其是在高流量环境中,可以防止数据包丢失。pcap_set_buffer_size(handle, BUFSIZE);//激活刚刚设置的参数if (pcap_activate(handle) != 0) {fprintf(stderr, " pcap_activate failed: %s\n", pcap_geterr(handle));return 1;}//编译 BPF(Berkeley Packet Filter)过滤器表达式,将过滤规则转化为库格式if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {fprintf(stderr, " Couldn't parse filter: %s\n", pcap_geterr(handle));return 1;}//应用过滤规则if (pcap_setfilter(handle, &fp) == -1) {fprintf(stderr, " Couldn't install filter: %s\n", pcap_geterr(handle));return 1;}// 打开输出文件dumper = pcap_dump_open(handle, outfile);if (!dumper) {fprintf(stderr, " Couldn't open dump file: %s\n", pcap_geterr(handle));return 1;}capture_context_t ctx = { .dumper = dumper };printf(" Saving packets to: %s\n", outfile);//抓多少包,抓到的包怎么处理packet_handlerpcap_loop(handle, 10, packet_handler, (u_char *)&ctx); // 抓 10 个包// 清理资源pcap_dump_close(dumper);pcap_freecode(&fp);pcap_close(handle);printf(" Capture complete. Output saved to: %s\n", outfile);return 0;
}

编译、需要进行库的链接,以及操作权限

gcc -o pcap_loop_example pcap_loop_example.c -lpcap
sudo ./pcap_loop_example

#四、Shell 脚本(自动添加权限)
可以当做自启动脚本

#!/bin/bash
# file: grant_pcap_cap.shTARGET="./pcap_loop_example "if [ ! -f "$TARGET" ]; thenecho "❌ $TARGET not found. Please compile it first."exit 1
fiecho "🔧 Adding capability to $TARGET ..."
sudo setcap cap_net_raw,cap_net_admin=eip $TARGETecho "✅ Done. You can now run it as a normal user:"
echo "   $TARGET"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark-Core编程

sortByKey算子&#xff1a;对(K, V)型RDD按key排序&#xff0c;K需实现Ordered接口&#xff0c;可指定升序或降序及分区数。 join算子&#xff1a;连接两个(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;类似SQL左外连接&#xff0c;返…

阅读MySQL实战45讲第9天

目录 一、你的 SQL 语句为什么变“慢” 二、什么情况会引发数据库的 flush 过程&#xff1f; 三、分析上面四种场景对性能的影响 四、InnoDB 刷脏页的控制策略 五、原作者小结&#xff1a; 引言&#xff1a; 一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时…

cin,cin.get(),getchar(),getline(),cin.get line()异同点

文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等价于cin.operator>>()&#xff0c;即调用成员函数operator>>()进行读取数据。 &#xff08;2&#xff09;当cin>>从缓冲区中读取数据时&…

VMware虚拟机Ubuntu磁盘扩容

VMware中操作&#xff1a; 选择要扩容的虚拟机&#xff0c;点击编辑虚拟机设置 打开后点击磁盘——>点击扩展&#xff08;注意&#xff1a;如果想要扩容的话需要删除快照&#xff09; 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…

卷积神经网络(CNN)可视化网站汇总

深度学习 文章目录 深度学习前言CNN ExplainerDeep Learning PlaygroundConvNetJSUnderstanding CNN with Interactive Visualizations3Blue1Brown Neural Networks YouTube PlaylistDistill.pubTensorFlow CNN Visualization (TensorBoard)NN-SVGOpenAI Microscope 前言 汇总…

实习技能记录【3】-----Git操作

1. Git是什么 Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS)。 它的核心目标是跟踪文件的变化&#xff0c;让你能够随时记录、回溯、协作和管理你的项目。 2. 介绍 2.1 Git 工作区、暂存区、本地仓库介绍 区域名称英文名说明相关命令工作区Wor…

蓝桥杯单片机刷题——按键设置当前采集距离为距离参数

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上。 按键“S5”定义为参数按键&#xff0c;按下S5按键&#xff0c;设备自动将当前采集的距离数据作为距离参数&#xff1b; 若测量的距离数据超过距离参数&#xff0c;指示灯L1点亮&#xff…

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型标配的推理加速功能&#xff0c;也是推理过程中&#xff0c;显存资源巨大开销的元凶之一。在模型推理时&#xff0c;KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…

Windows 图形显示驱动开发-WDDM 2.0功能_上下文监视

功能概述 上下文监视机制是GPU与CPU协同计算的核心同步技术&#xff0c;通过受监视围栏&#xff08;Monitored Fence&#xff09;实现跨硬件单元的高效协调。其核心目标是解决以下场景的同步需求&#xff1a; GPU引擎间同步&#xff1a;例如在多渲染管线中&#xff0c;后处理…

基于YOLOv8的机场跑道异物检测识别系统:提升航空安全的新一代解决方案(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 机场跑道异物检测领域概述 机场跑道异物(Foreign Object Debris, FOD)是指存在于机场跑道、滑行道等关…

网络协议学习

最近在适配ESP32的网络驱动&#xff0c;借此机会先学习一下网络通信协议。 以太网帧、IP包及TCP与UDP的报文格式一文读懂网络报问中的检验和&#xff08;checksum&#xff09;—— 原理举例代码 提问腾讯元宝提示词&#xff1a; TCP窗口是干什么的拥塞窗口是什么的

fit 转 gpx

新增 fit 转 gpx 功能 https://fittools.cc/home/fit2gpx

C++ I/O 性能优化指南

在高性能计算和大规模数据处理中&#xff0c;I/O 性能优化是提升系统整体效率的关键环节。C 作为一种高性能编程语言&#xff0c;提供了丰富的工具和机制来优化 I/O 操作。本文将详细介绍在 Linux 环境下&#xff0c;如何通过代码层面的优化、系统调用的选择以及多线程技术等手…

Python中内置的数据结构类型详析(内置数据容器)

目录 1. 元组&#xff08;Tuple&#xff09;​​2. 列表&#xff08;List&#xff09;​3. 字典&#xff08;Dict&#xff09;4. 集合&#xff08;Set&#xff09;​​5. 字符串&#xff08;Str&#xff09;6. 队列&#xff08;Queue&#xff09;与栈&#xff08;Stack&#xf…

Socket多路复用网络编程应用总结

Socket多路复用网络编程应用总结 概述 • 传统I/O模型的局限性&#xff1a;传统阻塞式I/O模型每次仅在一个文件描述符&#xff08;File Descriptor, FD&#xff09;上执行I/O操作&#xff0c;导致程序需等待单个操作完成&#xff0c;无法高效处理多连接场景&#xff08;如高并…

安卓开发提示Android Gradle plugin错误

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle&#xff08;如果有独立配置&#xff09;&#xff1a;…

【C++初阶】--- vector容器功能模拟实现

1.什么是vector&#xff1f; 在 C 里&#xff0c;std::vector 是标准模板库&#xff08;STL&#xff09;提供的一个非常实用的容器类&#xff0c;它可以看作是动态数组 2.成员变量 iterator _start;&#xff1a;指向 vector 中第一个元素的指针。 iterator _finish;&#x…

分布式锁在秒杀场景中的Python实现与CAP权衡

目录 一、分布式锁的前世今生 二、秒杀系统的 “硬核” 挑战 三、Python 实现分布式锁的 “实战演练” Redis 实现:快准狠 ZooKeeper 实现:稳如老狗 数据库实现:老实本分 四、CAP 理论的 “三角恋” 五、性能优化的 “锦囊妙计” 锁粒度控制:粗细有道 超时机制:别…

企业级开发SpringBoost玩转Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模块&#xff0c;可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8&#xff0c;并提供示例代码。 1. 添加依赖: 首先&#xff0c;需要在 pom.xml 文件中添加 spring-data-e…

磐石云智能语音客服系统——技术革新引领服务新体验

在人工智能技术飞速发展的今天&#xff0c;企业对于智能化客户服务的需求日益增长。磐石云智能语音客服系统凭借其前沿技术架构与深度场景适配能力&#xff0c;正在重新定义人机交互的边界。本文将深入解析该系统如何通过技术创新实现服务效率与体验的双重突破。 一、意图识别…