14次重大发布

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.20.0 2017年10月30日

#579 in 网络编程

Download history 22122/week @ 2024-05-02 28279/week @ 2024-05-09 20610/week @ 2024-05-16 20717/week @ 2024-05-23 19800/week @ 2024-05-30 20193/week @ 2024-06-06 18516/week @ 2024-06-13 22242/week @ 2024-06-20 31491/week @ 2024-06-27 24741/week @ 2024-07-04 27399/week @ 2024-07-11 28036/week @ 2024-07-18 26416/week @ 2024-07-25 27241/week @ 2024-08-01 25465/week @ 2024-08-08 23599/week @ 2024-08-15

107,348每月下载量
93个crate(9直接)中使用

MIT/Apache

265KB
5K SLoC

libpnet Crates.io 许可证 文档

构建状态:构建状态

讨论和支持

libpnet为使用Rust的底层网络提供跨平台API。

有四个关键组件

  • packet模块,允许安全地构建和操作数据包;
  • pnet_macroscrate,为数据包模块提供基础设施;
  • 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,请确保以“Install Npcap in WinPcap API-compatible Mode”模式安装)
  • 您必须将WinPcap开发者包中的Packet.lib放置在名为lib的目录中,在该存储库的根目录下。或者,您可以使用环境变量中列出的任何位置%LIB%/$Env:LIB。对于64位工具链,它位于WpdPack/Lib/x64/Packet.lib中,对于32位工具链,它位于WpdPack/Lib/Packet.lib中。

依赖项

~2.6–4.5MB
~75K SLoC