MIO EventLoop 不是 运行 用于 TcpStream
MIO EventLoop is not running for TcpStream
我是一个正在为异步 IO 问题苦苦挣扎的 Rust 初学者。我决定使用 mio。
我已经阅读了一些源代码+教程,但仍有一些基础部分我不明白。我正在使用 netcat -k -l 127.0.0.1 9999
设置服务器。然后我 运行 使用 cargo
进行简单测试(下面的代码)。我原以为 "ready" 或 "tick" 会引起恐慌。但它永远不会发生,测试永远是 运行。
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();
所以修复只是将套接字绑定到一个变量,这样当您调用事件循环时它会保持打开状态。
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();
然后您的代码将按照您的预期运行,并在套接字上有可读内容时立即出现恐慌。
我是一个正在为异步 IO 问题苦苦挣扎的 Rust 初学者。我决定使用 mio。
我已经阅读了一些源代码+教程,但仍有一些基础部分我不明白。我正在使用 netcat -k -l 127.0.0.1 9999
设置服务器。然后我 运行 使用 cargo
进行简单测试(下面的代码)。我原以为 "ready" 或 "tick" 会引起恐慌。但它永远不会发生,测试永远是 运行。
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();
所以修复只是将套接字绑定到一个变量,这样当您调用事件循环时它会保持打开状态。
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();
然后您的代码将按照您的预期运行,并在套接字上有可读内容时立即出现恐慌。