From c12af7676bccef47bcc55ece3766bcb2ab720b4e Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 18 Jul 2016 23:55:45 -0700 Subject: [PATCH] Finish completing accept/connect on Windows Apparently there are extra steps that need to be taken after a socket finishes being accepted and/or connected on Windows to prepare state like calling getsockaddr and getpeeraddr. This updates the `miow` binding to where it has these functions, then calls those functions in these situations. Closes #397 --- Cargo.toml | 5 +-- test/mod.rs | 3 +- test/test_local_addr_ready.rs | 66 +++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 test/test_local_addr_ready.rs diff --git a/Cargo.toml b/Cargo.toml index 1b961f6ed7..c6d856db38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ libc = "0.2.4" [target.'cfg(windows)'.dependencies] winapi = "0.2.1" -miow = "0.1.1" +miow = "0.1.3" [dev-dependencies] env_logger = "0.3.0" @@ -38,6 +38,3 @@ tempdir = "0.3.4" [[test]] name = "test" path = "test/mod.rs" - -[replace] -"miow:0.1.2" = { git = "https://github.com/alexcrichton/miow" } diff --git a/test/mod.rs b/test/mod.rs index 4a5b4f1615..7d1c18b395 100644 --- a/test/mod.rs +++ b/test/mod.rs @@ -13,6 +13,7 @@ mod test_battery; mod test_close_on_drop; mod test_double_register; mod test_echo_server; +mod test_local_addr_ready; mod test_multicast; mod test_notify; mod test_oneshot; @@ -21,6 +22,7 @@ mod test_register_deregister; mod test_register_multiple_event_loops; mod test_reregister_without_poll; mod test_smoke; +mod test_subprocess_pipe; mod test_tcp; mod test_tcp_level; mod test_tick; @@ -28,7 +30,6 @@ mod test_timer; mod test_udp_level; mod test_udp_socket; mod test_uds_shutdown; -mod test_subprocess_pipe; // ===== Unix only tests ===== #[cfg(unix)] diff --git a/test/test_local_addr_ready.rs b/test/test_local_addr_ready.rs new file mode 100644 index 0000000000..f2286e98b2 --- /dev/null +++ b/test/test_local_addr_ready.rs @@ -0,0 +1,66 @@ +use mio::*; +use mio::tcp::{TcpListener, TcpStream}; + +const LISTEN: Token = Token(0); +const CLIENT: Token = Token(1); +const SERVER: Token = Token(2); + +struct MyHandler { + listener: TcpListener, + connected: TcpStream, + accepted: Option, +} + +impl Handler for MyHandler { + type Timeout = (); + type Message = (); + + fn ready(&mut self, + event_loop: &mut EventLoop, + token: Token, + _: EventSet) { + match token { + LISTEN => { + let sock = self.listener.accept().unwrap().unwrap().0; + event_loop.register(&sock, + SERVER, + EventSet::writable(), + PollOpt::edge()).unwrap(); + self.accepted = Some(sock); + } + SERVER => { + self.accepted.as_ref().unwrap().peer_addr().unwrap(); + self.accepted.as_ref().unwrap().local_addr().unwrap(); + self.accepted.as_mut().unwrap().try_write(&[1, 2, 3]).unwrap(); + self.accepted = None; + } + CLIENT => { + self.connected.peer_addr().unwrap(); + self.connected.local_addr().unwrap(); + event_loop.shutdown(); + } + _ => panic!("unexpected token"), + } + } +} + +#[test] +fn local_addr_ready() { + let addr = "127.0.0.1:0".parse().unwrap(); + let server = TcpListener::bind(&addr).unwrap(); + let addr = server.local_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 { + listener: server, + connected: sock, + accepted: None, + }).unwrap(); +}