16 个重大版本发布

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 年 11 月 20 日

#835网络编程

Download history 54380/week @ 2024-04-22 50709/week @ 2024-04-29 49617/week @ 2024-05-06 68696/week @ 2024-05-13 54157/week @ 2024-05-20 49333/week @ 2024-05-27 56447/week @ 2024-06-03 55110/week @ 2024-06-10 55838/week @ 2024-06-17 54363/week @ 2024-06-24 59771/week @ 2024-07-01 60619/week @ 2024-07-08 59611/week @ 2024-07-15 70147/week @ 2024-07-22 62719/week @ 2024-07-29 64961/week @ 2024-08-05

259,593 每月下载
用于 231 个 Crates(15 个直接使用)

MIT/Apache

64KB
648

libpnet Crates.io 许可证 文档

构建状态:构建状态

讨论和支持

libpnet 提供了使用 Rust 进行低级网络编程的跨平台 API。

有四个关键组件

  • Packet 模块,允许安全地构建和操作数据包;
  • Packet 模块的 pnet_macros Crates,提供基础设施;
  • Transport 模块,允许实现传输协议;
  • Datalink 模块,允许直接发送和接收数据链路数据包。

为什么?

有很多理由使用低级网络,以及更多理由使用 Rust 来实现。这里简要概述一些:

开发传输协议

通常有两种方法来开发新的传输层协议:

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

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

下一个选项是将其用C语言编写 - 这将提供出色的性能,但伴随着许多其他问题

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

使用libpnet和Rust,你可以两者兼得。高级抽象、内存和线程安全性,以及C的性能。

网络工具

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

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

文档

最新构建的API文档可在此处找到: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中。

依赖关系

~170KB