В старых версиях mio doc я нахожу mio :: channel, который, по-видимому, использовался для создания канала, реализующего EventedFd
, который можно зарегистрировать с помощью Poll
.
Я также вижу на Reddit, что это было изменено в пользу чего-то другого, но я не могу понять, каков новый способ регистрации канала.
Каков текущий способ ожидания даты на канале (std::sync::mpsc
или что-то еще) с mio? Все, что я могу найти в Google, это ссылки на старые версии Mio Docs.
Спасибо!
Поскольку я столкнулся с той же проблемой, я надеюсь, что все в порядке, я предоставляю некоторый код, чтобы облегчить понимание вопроса:
use std::io;
use std::net::*; //{TcpListener,TcpStream,IpAddr,Ipv4Addr,SocketAddr};
use std::thread::*;
use std::sync::mpsc::*; //{Receiver,SyncSender,Sender,channel,sync_channel};
fn poll_quit( rx : &Receiver::<u8> ) -> bool {
match rx.try_recv() {
Ok(_) => true,
Err(TryRecvError::Empty) => false,
Err(TryRecvError::Disconnected) => true
}
}
fn guard_external_tcp_port( rx : Receiver::<u8>) -> () {
let listener = TcpListener::bind("127.0.0.1:8384").expect("tcp guard - bind failed!");
listener.set_nonblocking(true).expect("cannot set tcp listener to nonblocking!");
while false == poll_quit(&rx) {
match listener.accept() {
Ok((_s,pa)) => {
println!("tcp client connected: {} - closing it down."
, pa);
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
//wait_for_fd();
continue;
}
Err(e) => panic!("encountered IO error: {}", e),
}
}
}
fn start_tcpguard() -> (JoinHandle<()>,SyncSender::<u8>) {
let (tx,rx) = sync_channel::<u8>(0);
let thrd = spawn(move || {
guard_external_tcp_port(rx);
});
(thrd,tx)
}
До этого момента я пытался обойтись без mio, но проблема очевидна: вы хотите заблокировать, пока не поступит сообщение канала отключения или пока не будет сигнализирован сокет слушателя. Достаточно стимула перейти на мио. Если только Мио не сможет ждать Receiver
.