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 日

网络编程 中排名第 912

Download history 49215/week @ 2024-05-01 49474/week @ 2024-05-08 68298/week @ 2024-05-15 50569/week @ 2024-05-22 52350/week @ 2024-05-29 51054/week @ 2024-06-05 57960/week @ 2024-06-12 53864/week @ 2024-06-19 58982/week @ 2024-06-26 52798/week @ 2024-07-03 59060/week @ 2024-07-10 61412/week @ 2024-07-17 68331/week @ 2024-07-24 63990/week @ 2024-07-31 65750/week @ 2024-08-07 63206/week @ 2024-08-14

每月下载量 272,777
221 库中使用(直接使用 26 个)

MIT/Apache

265KB
4.5K SLoC

libpnet Crates.io License Documentation

构建状态: 构建状态

讨论和支持

libpnet 为使用 Rust 进行低级网络通信提供了一个跨平台的 API。

有四个关键组件

  • packet 模块,允许安全地构建和操作数据包;
  • pnet_macros 库,为数据包模块提供基础设施;
  • 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版本
  • 你必须已安装WinPcap或npcap(使用WinPcap 4.1.3版本进行测试)(如果使用npcap,请确保以“安装Npcap在WinPcap API兼容模式”安装)(如果使用npcap,请确保以“安装Npcap在WinPcap API兼容模式”安装)
  • 你必须将WinPcap开发者包中的Packet.lib放在一个名为lib的目录中,在该仓库的根目录下。或者,您可以使用%LIB%/$Env:LIB环境变量中列出的任何位置。对于64位工具链,它在WpdPack/Lib/x64/Packet.lib中,对于32位工具链,它在WpdPack/Lib/Packet.lib中。

依赖关系

~2.5–4MB
~73K SLoC