首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测MIO中的客户端挂机

检测MIO中的客户端挂机
EN

Stack Overflow用户
提问于 2015-06-10 14:26:00
回答 1查看 852关注 0票数 4

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

我尝试了以下几点:

代码语言:javascript
复制
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终止连接。我的代码会认为有新的数据可用(hint==ReadHint::data())。尝试读取它将导致零字节可用。

这个提示不应该像ReadHint::hup()那样吗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 18:31:06

在miov0.3.5上调用register时,默认情况是只为readable 利息注册,因此这是您将得到的唯一提示。

如果您也希望得到有关hup的警告,则需要使用函数选项并将InterestPollOpt作为参数,因此您的代码如下:

代码语言:javascript
复制
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(),因此这在将来不会成为一个问题。

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

https://stackoverflow.com/questions/30759271

复制
相关文章

相似问题

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