Better timeout management in the API

This commit is contained in:
Jeremy Wall 2021-02-01 17:13:55 -05:00
parent e331d94a26
commit 3a73734015
3 changed files with 12 additions and 23 deletions

View File

@ -74,11 +74,12 @@ pub fn main() {
socket4 socket4
.send_to(address.parse::<Ipv4Addr>().unwrap(), packet) .send_to(address.parse::<Ipv4Addr>().unwrap(), packet)
.unwrap(); .unwrap();
socket4.set_timeout(Duration::from_secs(1)).unwrap();
loop { loop {
let (resp, sock_addr) = match socket4.rcv_with_timeout(Duration::from_secs(1)) { let (resp, sock_addr) = match socket4.rcv_from() {
Ok(tpl) => tpl, Ok(tpl) => tpl,
Err(e) => { Err(e) => {
//eprintln!("{:?}", e); eprintln!("{:?}", e);
break; break;
} }
}; };

View File

@ -72,11 +72,12 @@ pub fn main() {
socket6 socket6
.send_to(address.parse::<Ipv6Addr>().unwrap(), packet) .send_to(address.parse::<Ipv6Addr>().unwrap(), packet)
.unwrap(); .unwrap();
socket6.set_timeout(Duration::from_secs(1)).unwrap();
loop { loop {
let (resp, sock_addr) = match socket6.rcv_with_timeout(Duration::from_secs(1)) { let (resp, sock_addr) = match socket6.rcv_from() {
Ok(tpl) => tpl, Ok(tpl) => tpl,
Err(e) => { Err(e) => {
//eprintln!("{:?}", e); eprintln!("{:?}", e);
break; break;
} }
}; };

View File

@ -30,6 +30,8 @@ pub trait IcmpSocket {
type AddrType; type AddrType;
type PacketType; type PacketType;
fn set_timeout(&mut self, timeout: Duration) -> std::io::Result<()>;
fn set_max_hops(&mut self, hops: u32); fn set_max_hops(&mut self, hops: u32);
fn bind<A: Into<Self::AddrType>>(&mut self, addr: A) -> std::io::Result<()>; fn bind<A: Into<Self::AddrType>>(&mut self, addr: A) -> std::io::Result<()>;
@ -37,11 +39,6 @@ pub trait IcmpSocket {
fn send_to(&mut self, dest: Self::AddrType, packet: Self::PacketType) -> std::io::Result<()>; fn send_to(&mut self, dest: Self::AddrType, packet: Self::PacketType) -> std::io::Result<()>;
fn rcv_from(&mut self) -> std::io::Result<(Self::PacketType, SockAddr)>; fn rcv_from(&mut self) -> std::io::Result<(Self::PacketType, SockAddr)>;
fn rcv_with_timeout(
&mut self,
timeout: Duration,
) -> std::io::Result<(Self::PacketType, SockAddr)>;
} }
pub struct Opts { pub struct Opts {
@ -98,13 +95,8 @@ impl IcmpSocket for IcmpSocket4 {
Ok((self.buf[0..read_count].try_into()?, addr)) Ok((self.buf[0..read_count].try_into()?, addr))
} }
fn rcv_with_timeout( fn set_timeout(&mut self, timeout: Duration) -> std::io::Result<()> {
&mut self, self.inner.set_read_timeout(Some(timeout))
timeout: Duration,
) -> std::io::Result<(Self::PacketType, SockAddr)> {
self.inner.set_read_timeout(Some(timeout))?;
let (read_count, addr) = self.inner.recv_from(&mut self.buf)?;
Ok((self.buf[0..read_count].try_into()?, addr))
} }
} }
@ -172,13 +164,8 @@ impl IcmpSocket for IcmpSocket6 {
Ok((self.buf[0..read_count].try_into()?, addr)) Ok((self.buf[0..read_count].try_into()?, addr))
} }
fn rcv_with_timeout( fn set_timeout(&mut self, timeout: Duration) -> std::io::Result<()> {
&mut self, self.inner.set_read_timeout(Some(timeout))
timeout: Duration,
) -> std::io::Result<(Self::PacketType, SockAddr)> {
self.inner.set_read_timeout(Some(timeout))?;
let (read_count, addr) = self.inner.recv_from(&mut self.buf)?;
Ok((self.buf[0..read_count].try_into()?, addr))
} }
} }