Проблема с типами буфера в Mio
Я хотел бы написать асинхронный сервер в Rust, используя mio, и у меня проблемы с типами буферов. Я пробовал разные типы буферов и не могу заставить его работать. Мой текущий код:
extern crate mio;
extern crate bytes;
use std::io;
use std::io::{Error, ErrorKind};
use std::net::SocketAddr;
use std::str::FromStr;
use std::io::Cursor;
use self::mio::PollOpt;
use self::mio::EventLoop;
use self::mio::EventSet;
use self::mio::Token;
use self::mio::Handler;
use self::mio::io::TryRead;
use self::mio::io::TryWrite;
//use self::mio::buf::ByteBuf;
//use self::mio::buf::Buf;
use self::mio::tcp::*;
use self::bytes::buf::Buf;
use self::bytes::buf::byte::ByteBuf;
struct EventHandler;
impl Handler for EventHandler {
type Timeout = ();
type Message = ();
fn ready(&mut self, event_loop: &mut EventLoop<EventHandler>, token: Token, events: EventSet) {
}
}
pub struct Connection {
sock: TcpStream,
send_queue: Vec<ByteBuf>,
}
impl Connection {
pub fn writable(&mut self, event_loop: &mut EventLoop<EventHandler>) -> Result<(), String> {
while !self.send_queue.is_empty() {
if !self.send_queue.first().unwrap().has_remaining() {
self.send_queue.pop();
}
let buf = self.send_queue.first_mut().unwrap();
match self.sock.try_write_buf(&mut buf) {
Ok(None) => {
return Ok(());
}
Ok(Some(n)) => {
continue;
}
Err(e) => {
return Err(format!("{}", e));
}
}
}
Ok(())
}
}
fn main() {
println!("Hello, world!");
}
Cargo.toml
содержит следующие зависимости:
mio = "*"
bytes = "*"
который в настоящее время переводится в байты 0.2.11 и mio 0.4.3 в Cargo.lock.
Я получаю следующую ошибку:
main.rs:45:29: 45:52 error: the trait `bytes::buf::Buf` is not implemented
for the type `&mut bytes::buf::byte::ByteBuf` [E0277]
main.rs:45 match self.sock.try_write_buf(&mut buf) {
Я хотел бы иметь возможность написать Vec<u8>
в сокет и обработать случай, когда буфер только частично записан. Как я могу это сделать?
Мне не нужно объяснение о коде, который правильно обрабатывает возвращаемые значения, этот вопрос о типе буфера. Я понятия не имею, какой тип буфера я должен использовать.
1 ответ
Проблема заключается в следующем:
let buf = self.send_queue.first_mut().unwrap();
match self.sock.try_write_buf(&mut buf) {
Вы проходите в &mut &mut ByteBuf
в try_write_buf
так как buf
уже &mut ByteBuf
, Просто бросьте лишний &mut
:
let buf = self.send_queue.first_mut().unwrap();
match self.sock.try_write_buf(buf) {