50个版本 (29个重大更新)

0.35.0 2024年5月30日
0.34.0 2023年7月19日
0.33.0 2023年2月3日
0.31.0 2022年6月1日
0.1.0 2015年7月31日

#1578网络编程

Download history 51518/week @ 2024-04-26 50100/week @ 2024-05-03 65612/week @ 2024-05-10 56013/week @ 2024-05-17 49777/week @ 2024-05-24 55118/week @ 2024-05-31 54810/week @ 2024-06-07 58981/week @ 2024-06-14 52277/week @ 2024-06-21 61756/week @ 2024-06-28 56970/week @ 2024-07-05 59333/week @ 2024-07-12 67710/week @ 2024-07-19 64156/week @ 2024-07-26 66207/week @ 2024-08-02 53515/week @ 2024-08-09

每月264,177次下载
用于 231 个crate(直接使用7个)

MIT/Apache

110KB
2.5K SLoC

libpnet Crates.io 许可证 文档

构建状态: 构建状态

讨论和支持

libpnet 为使用Rust的低级网络提供跨平台API。

有四个关键组件

  • packet 模块,允许安全地构建和操作数据包;
  • pnet_macros crate,为数据包模块提供基础设施;
  • transport 模块,允许实现传输协议;
  • datalink 模块,允许直接发送和接收数据链路数据包。

为什么?

使用低级别网络有很多原因,而使用Rust来做更是如此。以下是一些概述

开发传输协议

开发新的传输层协议通常有两种方式

  • 使用Python等脚本语言编写;
  • 使用C语言编写。

前者非常适合尝试新想法和快速原型设计,然而在现实世界的应用中并不理想。虽然通常可以从这些实现中获得合理的性能,但它们的速度通常比C语言实现慢得多,并且不适合任何“重负载”。

另一种选择是使用C语言编写——这将给您带来出色的性能,但同时也带来了一系列其他问题

  • 内存不安全——这是基于C的网络堆栈中安全漏洞和其他错误的一个巨大来源。忘记边界检查或在使用后释放指针后使用指针非常容易。
  • 线程不安全——您必须非常小心以确保正确使用并正确使用锁。
  • 缺乏高级抽象——Python等脚本语言的部分吸引力在于其高级抽象,这使得API更简单,编程更轻松。

使用libpnet和Rust,您可以得到两者之间的最佳结合。高级抽象、内存和线程安全性,以及C语言级别的性能。

网络工具

许多网络工具,如ping和traceroute,依赖于能够操作网络和传输头,而这在如std::io::net提供的标准网络堆栈中是不可能的。

直接在数据链路层工作,将数据包视为“在线上”的状态,这可能很有用。这有很多用途,包括网络诊断、数据包捕获和流量整形。

文档

最新构建的API文档可以在以下位置找到:[https://docs.rs/pnet/](https://docs.rs/pnet/)

使用方法

要在项目中使用libpnet,请将以下内容添加到您的Cargo.toml中

[dependencies.pnet]
version = "0.35.0"

libpnet应该与Rust的最新稳定版本兼容。

在运行测试套件时,有一些网络测试可能会失败——最简单的方法是以root或管理员用户运行cargo test。这通常可以避免,但会更加复杂。

Windows

在Windows上构建有三个要求

  • 您必须使用使用MSVC工具链的Rust版本
  • 您必须安装WinPcapnpcap(使用WinPcap 4.1.3版本进行测试)(如果您使用npcap,请确保以“安装Npcap以WinPcap API兼容模式”进行安装)
  • 您必须将来自WinPcap 开发者包Packet.lib放入以lib命名的目录中,该目录位于此仓库的根目录下。或者,您可以使用%LIB%/$Env:LIB环境变量中列出的任何位置。对于64位工具链,它在WpdPack/Lib/x64/Packet.lib,对于32位工具链,它在WpdPack/Lib/Packet.lib

依赖项

~2.4–4MB
~70K SLoC