首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIO EventLoop不运行TcpStream

MIO EventLoop不运行TcpStream
EN

Stack Overflow用户
提问于 2016-02-18 16:22:28
回答 1查看 287关注 0票数 3

我是一个生锈初学者,正在努力解决异步IO问题。我决定使用苗族

我读过一些源代码+教程,但仍然有一些基本的部分我不明白。我正在用netcat -k -l 127.0.0.1 9999设置一个服务器。然后,我使用cargo运行简单测试(下面的代码)。我本来希望看到“准备好”或“滴答”的恐慌。但它永远不会发生,而且测试永远在运行。

代码语言:javascript
复制
extern crate mio;
use mio::*;
#[allow(unused_imports)]
use mio::tcp::TcpStream;

#[allow(dead_code)]
struct MyHandler;

impl Handler for MyHandler {
    type Timeout = ();
    type Message = ();

    fn ready(&mut self, _event_loop: &mut EventLoop<Self>, _token: Token, _event_set: EventSet) {
        panic!("ready");
    }

    fn tick(&mut self, _event_loop: &mut EventLoop<Self>) {
        panic!("tick");
    }
}

#[test]
fn mio_test1() {
    let addr = "127.0.0.1:9999".parse().unwrap();
    let mut event_loop = EventLoop::<MyHandler>::new().unwrap();
    event_loop.register(&TcpStream::connect(&addr).unwrap(), Token(0), EventSet::readable(), PollOpt::level()).unwrap();
    event_loop.run(&mut MyHandler).unwrap();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-19 10:56:59

您的问题源于以下事实:您打开的套接字在事件循环有机会运行之前就已关闭。

您当前的代码大致相当于:

代码语言:javascript
复制
let addr = "127.0.0.1:9999".parse().unwrap();
let mut event_loop = EventLoop::<MyHandler>::new().unwrap();
{
    let sock = TcpStream::connect(&addr).unwrap();
    event_loop.register(&sock, Token(0), EventSet::readable(), PollOpt::level()).unwrap();
}   // The socket is closed here, before the event loop runs
event_loop.run(&mut MyHandler).unwrap();

因此,修复方法就是将套接字绑定到变量,以便在调用事件循环时保持打开状态。

代码语言:javascript
复制
let addr = "127.0.0.1:9999".parse().unwrap();
let mut event_loop = EventLoop::<MyHandler>::new().unwrap();
let sock = TcpStream::connect(&addr).unwrap();
event_loop.register(&sock, Token(0), EventSet::readable(), PollOpt::level()).unwrap();
event_loop.run(&mut MyHandler).unwrap();

然后,您的代码就会像您预期的那样运行,并且在套接字上有什么可读的东西时就会恐慌。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35486891

复制
相关文章

相似问题

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