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