出于学习目的,我目前正在尝试编写一个小程序,该程序将为 UDP 数据包实现 echo-server,该数据包将在一组端口(比如 10000-60000)上工作。因此,为此向 50k 线程发送垃圾邮件并不是那么好,因此我需要使用异步 IO,而 mio 非常适合此任务。但是我从一开始就遇到了这个代码的问题:
extern crate mio;
extern crate bytes;
use mio::udp::*;
use bytes::MutSliceBuf;
fn main() {
let addr = "127.0.0.1:10000".parse().unwrap();
let socket = UdpSocket::bound(&addr).unwrap();
let mut buf = [0; 128];
socket.recv_from(&mut MutSliceBuf::wrap(&mut buf));
}
它几乎是来自 mio 的 test_udp_socket.rs 的完整复制粘贴。但是当 mio 的测试成功通过时,我尝试编译此代码,但出现以下错误:
src/main.rs:12:12: 12:55 error: the trait `bytes::buf::MutBuf` is not implemented for the type `bytes::buf::slice::MutSliceBuf<'_>` [E0277]
src/main.rs:12 socket.recv_from(&mut MutSliceBuf::wrap(&mut buf));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:12:12: 12:55 help: run `rustc --explain E0277` to see a detailed explanation
但是从 bytes crate (也是它的本地副本)检查 src/buf/slice.rs 的代码,我们可以清楚地看到这个 trait 是如何实现的:
impl<'a> MutBuf for MutSliceBuf<'a> {
fn remaining(&self) -> usize {
self.bytes.len() - self.pos
}
fn advance(&mut self, mut cnt: usize) {
cnt = cmp::min(cnt, self.remaining());
self.pos += cnt;
}
unsafe fn mut_bytes<'b>(&'b mut self) -> &'b mut [u8] {
&mut self.bytes[self.pos..]
}
}
这可能是微不足道的,但我找不到它......可能是什么问题导致了这个错误?
我正在使用 rustc 1.3.0 (9a92aaf19 2015-09-15),板条箱 mio 和字节直接从 github 获得。