gpt4 book ai didi

rust - 在 MIO 中检测客户端挂断

转载 作者:行者123 更新时间:2023-11-29 07:53:58 24 4
gpt4 key购买 nike

使用 MIO (0.3.5) 时如何检测连接的终止?

我尝试了以下方法:

extern crate mio;
use mio::{EventLoop,Token,ReadHint};
use std::io::Read;

fn main(){
let listener = mio::tcp::TcpListener::bind("localhost:1234").unwrap();
let (stream,_) : (mio::tcp::TcpStream, _) = listener.accept().unwrap();

let mut event_loop = EventLoop::new().unwrap();
event_loop.register(&stream,Token(0)).unwrap();
println!("run...");
event_loop.run(&mut H{stream:stream}).unwrap();
}

struct H{stream : mio::tcp::TcpStream}

impl mio::Handler for H{
type Timeout = ();
type Message = ();

fn readable(&mut self, _ : &mut EventLoop<Self>, _ : Token, hint: ReadHint){
let mut buf: [u8; 500] = [0; 500];
println!("{} {}",(hint==ReadHint::data()),self.stream.read(&mut buf).unwrap());
std::thread::sleep_ms(1000);
}
}

运行这个。使用类似 nc localhost 1234 的方式连接到它。使用 Ctrl-C 终止连接。我的代码会认为有新数据可用 (hint==ReadHint::data())。尝试读取它将导致可用字节为零。

提示不应该是类似 ReadHint::hup() 的东西吗?

最佳答案

在 mio v0.3.5 上调用 register 时默认只为 readable 注册 Interest ,所以这是您将获得的唯一提示。

如果你也想被 hup 警告,你需要使用函数 register_opt并将你的 InterestPollOpt 作为参数,这样你的代码就变成了:

extern crate mio;
use mio::{EventLoop,Token,ReadHint,PollOpt,Interest};
use std::io::Read;

fn main() {
let listener = mio::tcp::TcpListener::bind("localhost:1234").unwrap();
let (stream,_) : (mio::tcp::TcpStream, _) = listener.accept().unwrap();

let mut event_loop = EventLoop::new().unwrap();
let interest = Interest::readable() | Interest::hup();
event_loop.register_opt(&stream,Token(0), interest,PollOpt::level()).unwrap();
println!("run...");
event_loop.run(&mut H{stream:stream}).unwrap();
}

struct H{stream : mio::tcp::TcpStream}

impl mio::Handler for H {
type Timeout = ();
type Message = ();

fn readable(&mut self, event_loop : &mut EventLoop<Self>, _ : Token, hint: ReadHint){
let mut buf: [u8; 500] = [0; 500];
if hint.is_hup() {
println!("Recieved hup, exiting");
event_loop.shutdown();
return;
}
println!("{} {}",hint.is_data(),self.stream.read(&mut buf).unwrap());
std::thread::sleep_ms(1000);
}
}

我认为便利功能 register 的默认值在 v0.4.0 中已更改为 Interest::all() 因此这在未来。

关于rust - 在 MIO 中检测客户端挂断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com