gpt4 book ai didi

multithreading - 使用 channel 在线程之间传递 Rust pnet 数据包

转载 作者:行者123 更新时间:2023-11-29 08:18:13 25 4
gpt4 key购买 nike

我正在开发一个读取和解析网络数据包的简单 Rust 程序。为了读取网络数据包,我使用 pnet libary .因为解析可能需要一些时间,所以我使用两个单独的线程来读取和解析数据包。

我现在的想法是通过消息传递(使用 mpsc::channel())将读取的包从第一个线程传递到第二个线程。这是我根据 the example given in the pnet doc 编写的代码的简化版本:

extern crate pnet;

use std::sync::mpsc;
use std::thread;

use pnet::datalink;
use pnet::datalink::Channel::Ethernet;

fn main() {
let (sender, receiver) = mpsc::channel();
thread::spawn(move || {
for packet in receiver.recv() {
println!("{:?}", packet)
}
});

let interface = datalink::interfaces().into_iter()
.find(|interface| interface.name == "enp5s0")
.unwrap();
let (_, mut package_receiver) =
match datalink::channel(&interface, Default::default()) {
Ok(Ethernet(tx, rx)) => (tx, rx),
_ => panic!()
};

loop {
match package_receiver.next() {
Ok(packet) => {
// sender.send("foo"); // this works fine
sender.send(packet);
}
_ => panic!()
}
}
}

这适用于通过 channel 发送原始类型或字符串,但不适用于网络数据包。当我尝试通过 channel 将数据包发送到解析器线程时,出现以下编译器错误:

error[E0597]: `*package_receiver` does not live long enough                                                                   
--> src/main.rs:28:15
|
28 | match package_receiver.next() {
| ^^^^^^^^^^^^^^^^ borrowed value does not live long enough
...
36 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...

我是 Rust 的新手,非常感谢您的帮助!

最佳答案

packet&[u8]类型,有一些生命周期 'a这也与对 package_receiver 的引用相同在next()称呼。 next()生命周期的定义将如下所示:

fn next(&'a mut self) -> Result<&'a [u8]>

send &[u8]到一个线程。但是该线程的生命周期可能比您发送给它的引用更长,从而导致悬空引用。结果编译器提示他们需要 'static生命周期。 "foo"有效,因为它是 &'static str .

一种方法是获取数据的所有权,然后将其作为值发送到另一个线程。

Ok(packet) => {
// sender.send("foo"); // this works fine
sender.send(packet.to_owned());
}

您还可以查看将作用域线程与 crossbeam 结合使用

关于multithreading - 使用 channel 在线程之间传递 Rust pnet 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53676102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com