alekzandren/cpp23-packet-sniffer

GitHub: alekzandren/cpp23-packet-sniffer

基于 C++23 和 libpcap 的轻量级实时网络数据包嗅探器,支持以太网、IPv4/IPv6、TCP/UDP 多层协议头部的零拷贝解析与格式化输出。

Stars: 1 | Forks: 0

# 现代 C++23 网络数据包嗅探器 一个使用 **libpcap** 编写的轻量级、高性能、实时网络数据包嗅探器和头部解析器,采用 **C++23**。 本项目展示了现代 C++ 的设计原则,包括严格的资源管理 (RAII)、零拷贝内存抽象 (`std::span`),以及为 JetBrains CLion 和 CMake 配置的模块化架构。 ## 主要特性 * **实时捕获:** 使用 `libpcap` 在选定接口上捕获并处理实时网络流量。 * **多层协议解析:** * **L2 (数据链路层):** Ethernet 帧(MAC 地址、EtherType)。 * **L3 (网络层):** IPv4 和 IPv6 头部,地址格式化。 * **L4 (传输层):** TCP 和 UDP 源/目的端口。 * **现代 C++23 架构:** * **RAII 资源管理:** 将 `pcap_t` 句柄封装在自定义的 `std::unique_ptr` 删除器中,以防止资源泄漏。 * **安全的内存处理:** 使用 `std::span` 安全解析原始数据包缓冲区,无需进行不必要的内存分配。 * **清晰的类型安全:** 广泛使用 `std::string_view`、`std::optional` 和 `std::format`。 * **优雅终止:** 异步信号处理(`SIGINT` / `Ctrl+C`)调用 `pcap_breakloop()` 实现安全关闭。 ## 项目结构 ``` . ├── CMakeLists.txt ├── include/ │ ├── PcapSession.hpp # RAII wrapper for libpcap handles & loop management │ └── PacketParser.hpp # Zero-copy header extraction & formatting └── src/ ├── main.cpp # CLI entry point & signal handling ├── PcapSession.cpp └── PacketParser.cpp ``` ## 快速开始 **前置条件** 您需要安装支持 C++23 的编译器(GCC 13+ 或 Clang 16+)、CMake 3.25+ 以及 `libpcap`。 **Ubuntu / Debian** ``` sudo apt update sudo apt install build-essential cmake libpcap-dev pkg-config ``` **Fedora / RHEL** ``` sudo dnf install gcc-c++ cmake libpcap-devel pkgconf-pkg-config ``` **macOS (Homebrew)** ``` brew install cmake libpcap pkg-config ``` ## 构建与运行 1. 通过 CMake 构建 ``` mkdir build && cd build cmake .. cmake --build . ``` 2. 执行 捕获原始网络数据包需要管理员权限(root 或 CAP_NET_RAW capability)。 选项 A:使用 `sudo` 运行 ``` # 在默认 interface 上抓包 sudo ./pcap_sniffer # 或指定自定义 interface(例如,eth0、wlan0) sudo ./pcap_sniffer eth0 ``` 选项 B:为二进制文件授予权限(推荐用于 CLion 调试) ``` sudo setcap cap_net_raw,cap_net_admin=eip ./pcap_sniffer ./pcap_sniffer ``` ## 示例输出 ``` [*] Capturing on interface: eth0 Timestamp | Src MAC -> Dst MAC | Proto | Src IP:Port -> Dst IP:Port | Bytes ----------------------------------------------------------------------------------------------------------------------------------- 2026-07-23 14:10:05.1234 | aa:bb:cc:dd:ee:ff -> 11:22:33:44:55:66 | TCP | 192.168.1.15:443 -> 192.168.1.100:54321 | 66 2026-07-23 14:10:05.1298 | 11:22:33:44:55:66 -> aa:bb:cc:dd:ee:ff | UDP | 192.168.1.1:53 -> 192.168.1.15:61002 | 84 ``` ## 许可证 本项目是开源的,基于 MIT 许可证发布。
标签:Bash脚本, C++23, 网络嗅探, 零拷贝