[mio] stop阻塞的问题
This commit is contained in:
@@ -86,40 +86,29 @@ fn icmp_proxy(
|
|||||||
.register(&mut icmp_socket, SERVER, Interest::READABLE)?;
|
.register(&mut icmp_socket, SERVER, Interest::READABLE)?;
|
||||||
let mut events = Events::with_capacity(32);
|
let mut events = Events::with_capacity(32);
|
||||||
let stop = Waker::new(poll.registry(), NOTIFY)?;
|
let stop = Waker::new(poll.registry(), NOTIFY)?;
|
||||||
let _worker = stop_manager.add_listener("icmp_proxy".into(), move || {
|
let worker = stop_manager.add_listener("icmp_proxy".into(), move || {
|
||||||
if let Err(e) = stop.wake() {
|
if let Err(e) = stop.wake() {
|
||||||
log::warn!("stop icmp_proxy:{:?}", e);
|
log::warn!("stop icmp_proxy:{:?}", e);
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
|
// linux上收不到通知,原因未知
|
||||||
|
drop(worker);
|
||||||
let mut buf = [0u8; 65535 - 20 - 8];
|
let mut buf = [0u8; 65535 - 20 - 8];
|
||||||
loop {
|
loop {
|
||||||
poll.poll(&mut events, None)?;
|
poll.poll(&mut events, None)?;
|
||||||
|
if stop_manager.is_stop() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
for event in events.iter() {
|
for event in events.iter() {
|
||||||
match event.token() {
|
match event.token() {
|
||||||
SERVER => loop {
|
SERVER => readable_handle(
|
||||||
let (len, addr) = match icmp_socket.recv_from(&mut buf[12..]) {
|
&icmp_socket,
|
||||||
Ok(rs) => rs,
|
&mut buf,
|
||||||
Err(e) => {
|
&nat_map,
|
||||||
if e.kind() == io::ErrorKind::WouldBlock {
|
&context,
|
||||||
break;
|
¤t_device,
|
||||||
}
|
&client_cipher,
|
||||||
log::warn!("icmp_socket {:?}", e);
|
),
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if let IpAddr::V4(peer_ip) = addr.ip() {
|
|
||||||
recv_handle(
|
|
||||||
&mut buf,
|
|
||||||
12 + len,
|
|
||||||
peer_ip,
|
|
||||||
&nat_map,
|
|
||||||
&context,
|
|
||||||
¤t_device,
|
|
||||||
&client_cipher,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
NOTIFY => {
|
NOTIFY => {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
@@ -128,7 +117,38 @@ fn icmp_proxy(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fn readable_handle(
|
||||||
|
icmp_socket: &UdpSocket,
|
||||||
|
buf: &mut [u8],
|
||||||
|
nat_map: &Mutex<HashMap<(Ipv4Addr, u16, u16), Ipv4Addr>>,
|
||||||
|
context: &Context,
|
||||||
|
current_device: &AtomicCell<CurrentDeviceInfo>,
|
||||||
|
client_cipher: &Cipher,
|
||||||
|
) {
|
||||||
|
loop {
|
||||||
|
let (len, addr) = match icmp_socket.recv_from(&mut buf[12..]) {
|
||||||
|
Ok(rs) => rs,
|
||||||
|
Err(e) => {
|
||||||
|
if e.kind() == io::ErrorKind::WouldBlock {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
log::warn!("icmp_socket {:?}", e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let IpAddr::V4(peer_ip) = addr.ip() {
|
||||||
|
recv_handle(
|
||||||
|
buf,
|
||||||
|
12 + len,
|
||||||
|
peer_ip,
|
||||||
|
&nat_map,
|
||||||
|
&context,
|
||||||
|
¤t_device,
|
||||||
|
&client_cipher,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
fn recv_handle(
|
fn recv_handle(
|
||||||
buf: &mut [u8],
|
buf: &mut [u8],
|
||||||
data_len: usize,
|
data_len: usize,
|
||||||
|
|||||||
Reference in New Issue
Block a user