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, 网络嗅探, 零拷贝