Crates.io | pcapfile-io |
lib.rs | pcapfile-io |
version | 0.1.0 |
created_at | 2025-08-21 08:39:18.664609+00 |
updated_at | 2025-08-21 08:39:18.664609+00 |
description | 高性能PCAP文件读写库 |
homepage | |
repository | https://github.com/Zoranner/pcapfile-io |
max_upload_size | |
id | 1804450 |
size | 305,784 |
一个用Rust编写的高性能数据包文件处理库,提供了完整的数据包文件读写功能。本库使用自定义的PCAP格式(与标准PCAP格式不同),专为高性能数据采集和回放设计。
在 Cargo.toml
中添加依赖:
[dependencies]
pcapfile-io = "0.1.0"
use pcapfile_io::{
Configuration, DataPacket, Reader, Writer, Result,
};
fn main() -> Result<()> {
// 创建配置
let mut config = Configuration::default();
config.max_packets_per_file = 1000;
config.buffer_size = 64 * 1024; // 64KB
// 写入数据集
let mut writer = Writer::new("my_dataset")?;
let data = b"Hello, World!".to_vec();
let packet = DataPacket::from_datetime(chrono::Utc::now(), data)?;
writer.write_packet(&packet)?;
writer.flush()?;
// 读取数据集
let mut reader = Reader::new("my_dataset")?;
while let Some(packet) = reader.read_packet()? {
println!("读取数据包: {:?}", packet);
}
Ok(())
}
use pcapfile_io::{Configuration, DataPacket, Writer, Result};
fn batch_operations() -> Result<()> {
let config = Configuration::default();
let mut writer = Writer::new("batch_dataset")?;
// 批量写入
let mut packets = Vec::new();
for i in 0..1000 {
let data = format!("批量数据包 #{i}").into_bytes();
let packet = DataPacket::from_datetime(chrono::Utc::now(), data)?;
packets.push(packet);
}
writer.write_packets(&packets)?;
writer.flush()?;
// 获取数据集信息(简化接口)
let reader = Reader::new("batch_dataset")?;
let info = reader.dataset_info();
println!("数据集信息: {:?}", info);
Ok(())
}
详细的API文档请访问:https://docs.rs/pcapfile-io
本库基于以下核心设计理念:
pcapfile-io/
├── src/
│ ├── lib.rs # 主模块入口
│ ├── config.rs # 配置管理
│ ├── structures.rs # 数据结构定义
│ ├── traits.rs # trait定义(已简化)
│ ├── reader.rs # 数据集读取器(用户接口)
│ ├── writer.rs # 数据集写入器(用户接口)
│ ├── file_reader.rs # 单个文件读取器(内部)
│ ├── file_writer.rs # 单个文件写入器(内部)
│ ├── index/
│ │ ├── mod.rs # 索引模块入口
│ │ ├── reader.rs # 索引读取器
│ │ ├── writer.rs # 索引写入器
│ │ └── utils.rs # 索引工具类
│ ├── utils.rs # 工具函数
│ └── error.rs # 错误处理
Configuration
: 配置管理DataPacket
: 数据包结构PcapFileHeader
: 文件头结构DataPacketHeader
: 数据包头部结构PcapReader
: 数据集读取器PcapWriter
: 数据集写入器DatasetInfo
: 数据集信息FileInfo
: 文件信息本库使用自定义的PCAP格式(与标准PCAP格式不同),专为高性能数据采集设计。
偏移量 | 长度(字节) | 名称 | 描述 |
---|---|---|---|
0 | 4 | Magic Number | 固定值 0xD4C3B2A1 |
4 | 2 | Major Version | 主版本号,当前为 0x0002 |
6 | 2 | Minor Version | 次版本号,当前为 0x0004 |
8 | 4 | Timezone Offset | 时区偏移量,通常为 0 |
12 | 4 | Timestamp Accuracy | 时间戳精度,固定为 0 |
每个数据包由一个头部和实际数据组成:
偏移量 | 长度(字节) | 名称 | 描述 |
---|---|---|---|
0 | 4 | Timestamp Seconds | 时间戳秒部分 (UTC) |
4 | 4 | Timestamp Nanoseconds | 时间戳纳秒部分 (UTC) |
8 | 4 | Packet Length | 数据包长度(字节) |
12 | 4 | Checksum | 数据包校验和(CRC32) |
紧随数据包头部之后,存储实际的数据内容。数据长度由数据包头部中的 Packet Length
字段指定。
pub struct Configuration {
pub max_packets_per_file: usize, // 每个文件最大数据包数量
pub buffer_size: usize, // 缓冲区大小
pub max_packet_size: usize, // 最大数据包大小
pub auto_flush: bool, // 是否自动刷新
pub enable_validation: bool, // 是否启用验证
pub temp_directory: PathBuf, // 临时目录路径
}
impl Configuration {
pub fn default() -> Self;
pub fn validate(&self) -> Result<(), String>;
}
pub struct Reader {
// 内部实现
}
impl Reader {
pub fn new<P: AsRef<Path>>(dataset_path: P: PcapConfiguration) -> Result<Self>;
// 自动初始化,无需手动调用
}
impl Read for Reader {
fn read_packet(&mut self) -> Result<Option<DataPacket>>;
fn read_packets(&mut self, count: usize) -> Result<Vec<DataPacket>>;
fn reset(&mut self) -> Result<()>;
}
impl Info for Reader {
fn dataset_info(&self) -> DatasetInfo; // 包含所有统计信息
fn detailed_file_list(&self) -> Vec<FileInfo>; // 按需使用
}
pub struct Writer {
// 内部实现
}
impl Writer {
pub fn new<P: AsRef<Path>>(dataset_path: P: Configuration) -> Result<Self>;
// finalize() 自动在Drop中调用,无需手动调用
}
impl Write for Writer {
fn write_packet(&mut self, packet: &DataPacket) -> Result<()>;
fn write_packets(&mut self, packets: &[DataPacket]) -> Result<()>;
fn flush(&mut self) -> Result<()>;
}
impl Info for Writer {
fn dataset_info(&self) -> DatasetInfo; // 包含所有统计信息
fn detailed_file_list(&self) -> Vec<FileInfo>; // 按需使用
}
/// 数据包读取trait
pub trait Read {
fn read_packet(&mut self) -> Result<Option<DataPacket>>;
fn read_packets(&mut self, count: usize) -> Result<Vec<DataPacket>>;
fn reset(&mut self) -> Result<()>;
}
/// 数据包写入trait
pub trait Write {
fn write_packet(&mut self, packet: &DataPacket) -> Result<()>;
fn write_packets(&mut self, packets: &[DataPacket]) -> Result<()>;
fn flush(&mut self) -> Result<()>;
}
/// 数据集信息trait(简化版)
pub trait Info {
fn dataset_info(&self) -> DatasetInfo; // 包含包数、文件数、大小、时间范围
fn detailed_file_list(&self) -> Vec<FileInfo>; // 按需使用
}
data_yyMMdd_HHmmss_nnnnnnnnn.pcap
格式(9位纳秒)write_100_packets time: [1.2345 ms 1.3456 ms 1.4567 ms]
write_1000_packets time: [12.345 ms 13.456 ms 14.567 ms]
read_1000_packets time: [8.9012 ms 9.0123 ms 9.1234 ms]
运行单元测试:
cargo test
运行集成测试:
cargo test --test integration_tests
运行性能基准测试:
cargo bench
查看 examples/
目录中的完整示例:
basic_usage.rs
- 基本使用示例batch_usage.rs
- 批量操作示例运行示例:
cargo run --example basic_usage
cargo run --example batch_usage
pub enum PcapError {
Io(std::io::Error),
FileNotFound(String),
DirectoryNotFound(String),
InvalidFormat(String),
Configuration(String),
Packet(String),
}
pub type Result<T> = std::result::Result<T, PcapError>;
flush
方法确保数据写入磁盘,防止系统崩溃导致数据丢失欢迎贡献代码!请查看 CONTRIBUTING.md 了解贡献指南。
# 克隆仓库
git clone https://github.com/kimotech/pcapfile-io.git
cd pcapfile-io
# 安装依赖
cargo build
# 运行测试
cargo test
# 运行基准测试
cargo bench
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
PcapFile.IO - 让数据包文件处理变得简单高效! 🚀