linux - MIO EventLoop 未针对 TcpStream 运行

标签 linux tcp rust mio

我是一名 Rust 初学者,正在为异步 IO 问题而苦苦挣扎。我决定使用 mio .

我已经阅读了一些源代码和教程,但仍有一些基本部分我不明白。我正在使用 netcat -k -l 127.0.0.1 9999 设置服务器。然后我用 cargo(下面的代码)运行简单的测试。我期待看到“准备好”或“滴答声”的 panic 。但它永远不会发生,测试会永远运行。

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();
}

最佳答案

您的问题是因为您打开的套接字在您的事件循环有机会运行之前关闭。

您当前的代码大致等同于:

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();

所以修复只是将套接字绑定(bind)到一个变量,这样当您调用事件循环时它会保持打开状态。

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();

然后您的代码将按照您的预期运行,并在套接字上有可读取的内容时立即出现错误。

关于linux - MIO EventLoop 未针对 TcpStream 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35486891/

相关文章:

linux - 用值 0 替换特定列中的最后一个字符

c++ - Boost::ASIO:在多线程上使用 tcp::socket

opencv - OpenCV 的 Rust 绑定(bind)似乎缺少面部模块

linux - 有人可以向初学者提供有关 Hadoop 工作原理的高级、简单的解释吗?

linux - Windows Server 2012 R2 NFS 身份映射 linux 客户端

linux - 在 Linux 服务器上构建 windows 7z SelF-eXtracting 安装程序,如何更改 exe 图标?

iOS TCP/IP over USB 与 Linux 端

TCP发送命令并等待输出

rust - 静态的 future 生命周期不长

rust - 从固定大小的 c_char 数组转换为 CString