fn query_inner()

in mini-sntp/src/lib.rs [65:111]


fn query_inner(socket: &UdpSocket, addr: impl ToSocketAddrs) -> Result<SntpTimeQueryResult, Error> {
    let addr = addr
        .to_socket_addrs()
        .map_err(|err| Error::ResolveNtpPoolHostname(Some(err)))?
        .next()
        .ok_or(Error::ResolveNtpPoolHostname(None))?;

    let request_transmit_timestamp = {
        let (buf, request_transmit_timestamp) = create_client_request();

        #[cfg(test)]
        std::thread::sleep(std::time::Duration::from_secs(5)); // simulate network delay

        let mut buf = &buf[..];
        while !buf.is_empty() {
            let sent = socket
                .send_to(buf, addr)
                .map_err(Error::SendClientRequest)?;
            buf = &buf[sent..];
        }

        request_transmit_timestamp
    };

    let result = {
        let mut buf = [0_u8; 48];

        {
            let mut buf = &mut buf[..];
            while !buf.is_empty() {
                let (received, received_from) = socket
                    .recv_from(buf)
                    .map_err(Error::ReceiveServerResponse)?;
                if received_from == addr {
                    buf = &mut buf[received..];
                }
            }
        }

        #[cfg(test)]
        std::thread::sleep(std::time::Duration::from_secs(5)); // simulate network delay

        parse_server_response(buf, request_transmit_timestamp)?
    };

    Ok(result)
}