[mio] stop阻塞的问题

This commit is contained in:
lubeilin
2024-03-02 23:13:59 +08:00
parent 20fd060821
commit bd73ed213e
+46 -26
View File
@@ -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; &current_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,
&current_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,
&current_device,
&client_cipher,
);
}
}
}
fn recv_handle( fn recv_handle(
buf: &mut [u8], buf: &mut [u8],
data_len: usize, data_len: usize,