【发布时间】:2022-03-01 16:22:12
【问题描述】:
我正在开发一个读取和解析网络数据包的简单 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!()
}
}
}
这适用于通过通道发送原始类型或字符串,但不适用于网络数据包。当我尝试通过通道向解析器线程发送数据包时,出现以下编译器错误:
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 的新手,非常感谢您的帮助!
【问题讨论】:
标签: multithreading rust pcap