Skip to content

Instantly share code, notes, and snippets.

@housleyjk
Created May 30, 2016 12:17
Show Gist options
  • Save housleyjk/fa0ab22ef2264818c43d25ab2ed76ffb to your computer and use it in GitHub Desktop.
Save housleyjk/fa0ab22ef2264818c43d25ab2ed76ffb to your computer and use it in GitHub Desktop.
extern crate mio;
use mio::*;
use mio::tcp::{TcpListener, TcpStream};
const LISTEN: Token = Token(0);
const CLIENT: Token = Token(1);
const SERVER: Token = Token(2);
struct MyHandler(TcpListener, TcpStream, Option<TcpStream>);
impl Handler for MyHandler {
type Timeout = ();
type Message = ();
fn ready(&mut self, event_loop: &mut EventLoop<MyHandler>, token: Token, _: EventSet) {
match token {
LISTEN => {
let MyHandler(ref mut server, _, ref mut holder) = *self;
let sock = server.accept().unwrap().unwrap().0;
event_loop.register(
&sock,
SERVER,
EventSet::writable(),
PollOpt::edge()).unwrap();
*holder = Some(sock)
}
SERVER => {
println!("Server peer {:?}", self.2.as_ref().unwrap().peer_addr());
println!("Server local {:?}", self.2.as_ref().unwrap().local_addr());
self.2.as_mut().unwrap().try_write(&mut [1, 2, 3u8]).unwrap();
self.2 = None;
}
CLIENT => {
println!("Client peer {:?}", self.1.peer_addr());
println!("Client local {:?}", self.1.local_addr());
event_loop.shutdown();
}
_ => panic!("unexpected token"),
}
}
}
fn main() {
let addr = "127.0.0.1:13265".parse().unwrap();
let server = TcpListener::bind(&addr).unwrap();
let mut event_loop = EventLoop::new().unwrap();
event_loop.register(&server, LISTEN, EventSet::readable(),
PollOpt::edge()).unwrap();
let sock = TcpStream::connect(&addr).unwrap();
event_loop.register(&sock, CLIENT, EventSet::readable(),
PollOpt::edge()).unwrap();
event_loop.run(&mut MyHandler(server, sock, None)).unwrap();
}
@housleyjk
Copy link
Author

Results on Windows

Server peer Err(Error { repr: Os { code: 10057, message: "A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied." } })
Server local Err(Error { repr: Os { code: 10022, message: "An invalid argument was supplied." } })
Client peer Err(Error { repr: Os { code: 10057, message: "A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied." } })
Client local Ok(V4(127.0.0.1:50325))```

@housleyjk
Copy link
Author

housleyjk commented May 30, 2016

Results on Linux

Server peer Ok(V4(127.0.0.1:54170))
Server local Ok(V4(127.0.0.1:13265))
Client peer Ok(V4(127.0.0.1:13265))
Client local Ok(V4(127.0.0.1:54170))```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment