ntp/
lib.rs

1/*!
2# Example
3
4```rust
5fn main() {
6    let address = "0.pool.ntp.org:123";
7    let response: ntp::packet::Packet = ntp::request(address).unwrap();
8    let ntp_time = response.transmit_time;
9    println!("{}", ntp_time);
10}
11```
12*/
13
14#![recursion_limit = "1024"] 
15
16#[macro_use] extern crate custom_derive;
17#[macro_use] extern crate conv;
18#[macro_use] extern crate error_chain;
19#[macro_use] extern crate log;
20extern crate byteorder;
21extern crate time;
22
23use std::io::Cursor;
24use std::net::{ToSocketAddrs,UdpSocket};
25use std::time::Duration;
26
27
28
29pub mod errors;
30pub mod formats;
31pub mod packet;
32
33pub fn request<A: ToSocketAddrs>(addr: A) -> errors::Result<packet::Packet> {
34    let data: Vec<u8> = packet::Packet::new_client().into();
35    let sock = UdpSocket::bind("0.0.0.0:0")?;
36    sock.set_read_timeout(Some(Duration::from_secs(5)))?;
37    sock.set_write_timeout(Some(Duration::from_secs(5)))?;
38    let sz = sock.send_to(&data, addr)?;
39    debug!("{:?}", sock.local_addr());
40    debug!("sent: {}", sz);
41    let mut buf = vec![0; 48];
42    let res = sock.recv(&mut buf)?;
43    debug!("recv: {:?}", res);
44    debug!("{:?}", &buf[..]);
45    let rdr = Cursor::new(&buf);
46    return Ok(packet::Packet::try_from(rdr)?);
47}
48
49#[test]
50fn test_request_ntp_org() {
51    let res = request("0.pool.ntp.org:123");
52    let _ = res.expect("Failed to get a ntp packet from ntp.org");
53}
54
55#[test]
56fn test_request_google() {
57    let res = request("time.google.com:123");
58    let _ = res.expect("Failed to get a ntp packet from time.google.com");
59}