首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mio中缓冲区类型的故障

mio中缓冲区类型的故障
EN

Stack Overflow用户
提问于 2015-10-24 07:53:41
回答 1查看 486关注 0票数 1

我想使用mio用Rust编写异步服务器,缓冲区类型有问题。我尝试过不同的缓冲区类型,但无法让它工作。我目前的代码是:

代码语言:javascript
复制
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包含以下依赖项:

代码语言:javascript
复制
mio = "*"
bytes = "*"

它目前在Cargo.lock中转换为字节0.2.11和mio0.4.3。

我得到的错误是:

代码语言:javascript
复制
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>写入套接字,并在缓冲区只部分写入时处理这种情况。我怎样才能做到这一点?

我不需要解释正确处理返回值的代码,这个问题是关于缓冲区类型的。我不知道我必须使用哪种缓冲区类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-24 10:51:55

问题是:

代码语言:javascript
复制
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

代码语言:javascript
复制
let buf = self.send_queue.first_mut().unwrap();
match self.sock.try_write_buf(buf) {
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33315842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档