fix socket_is_dead on windows
This commit is contained in:
		| @@ -310,22 +310,38 @@ fn socket_is_dead(socket: &TcpStream) -> bool { | |||||||
| #[cfg(windows)] | #[cfg(windows)] | ||||||
| fn socket_is_dead(socket: &TcpStream) -> bool { | fn socket_is_dead(socket: &TcpStream) -> bool { | ||||||
|     use std::mem; |     use std::mem; | ||||||
|     use std::os::windows::io::AsRawSocket; |     use std::os::windows::io::{AsRawSocket, RawSocket}; | ||||||
|     use std::ptr; |     use std::ptr; | ||||||
|     use libc::{FD_SET, select, timeval}; |     use libc::{c_int, timeval}; | ||||||
|  |  | ||||||
|  |     const FD_SETSIZE: usize = 64; | ||||||
|  |  | ||||||
|  |     #[repr(C)] | ||||||
|  |     struct fd_set { | ||||||
|  |         fd_count: c_int, | ||||||
|  |         fd_array: [RawSocket; FD_SETSIZE], | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     extern "system" { | ||||||
|  |         fn select(maxfds: c_int, readfs: *mut fd_set, writefs: *mut fd_set, | ||||||
|  |                   errfs: *mut fd_set, timeout: *mut timeval) -> c_int; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     let ret = unsafe { |     let ret = unsafe { | ||||||
|         let fd = socket.as_raw_socket(); |         let fd = socket.as_raw_socket(); | ||||||
|         let nfds = 0; // msdn says nfds is ignored |         let nfds = 0; // msdn says nfds is ignored | ||||||
|         let timeout = timeval { |         let mut timeout = timeval { | ||||||
|             tv_sec: 0, |             tv_sec: 0, | ||||||
|             tv_usec: 0, |             tv_usec: 0, | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         let mut readfs = mem::zeroed(); |         let mut readfs: fd_set = mem::zeroed(); | ||||||
|         let mut errfs = mem::zeroed(); |         let mut errfs: fd_set = mem::zeroed(); | ||||||
|         FD_SET(fd, &mut readfs); |         readfs.fd_count = 1; | ||||||
|         FD_SET(fd, &mut errfs); |         readfs.fd_array[0] = fd; | ||||||
|  |         errfs.fd_count = 1; | ||||||
|  |         errfs.fd_array[0] = fd; | ||||||
|  |  | ||||||
|         select(nfds, &mut readfs, ptr::null_mut(), &mut errfs, &mut timeout) |         select(nfds, &mut readfs, ptr::null_mut(), &mut errfs, &mut timeout) | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user