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 日

网络编程 中排名 1561

Download history 27405/week @ 2024-05-01 24208/week @ 2024-05-08 35613/week @ 2024-05-15 26882/week @ 2024-05-22 27189/week @ 2024-05-29 26137/week @ 2024-06-05 26391/week @ 2024-06-12 29477/week @ 2024-06-19 35902/week @ 2024-06-26 33178/week @ 2024-07-03 35576/week @ 2024-07-10 36117/week @ 2024-07-17 34291/week @ 2024-07-24 35777/week @ 2024-07-31 33349/week @ 2024-08-07 34973/week @ 2024-08-14

每月下载量 145,941
178 个 crate(直接使用 34 个) 使用

MIT/Apache 许可

160KB
3.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/

使用方法

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

[dependencies.pnet]
version = "0.35.0"

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

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

Windows

在Windows上构建有三个要求

  • 您必须使用使用MSVC工具链的Rust版本
  • 您必须已安装WinPcapnpcap(已测试WinPcap版本4.1.3)(如果使用npicap,请确保以“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

依赖项

~0.3–9.5MB
~59K SLoC