extern crate nng;
extern crate byteorder;
use std::{env, mem, process};
use std::time::SystemTime;
use nng::{Socket, Protocol, Message};
use byteorder::{ByteOrder, LittleEndian};
const DATE_REQUEST: u64 = 1;
fn main() -> Result<(), nng::Error>
{
let args: Vec<_> = env::args().take(3).collect();
match &args[..] {
[_, t, url] if t == "client" => client(url),
[_, t, url] if t == "server" => server(url),
_ => {
println!("Usage: reqrep client|server <URL>");
process::exit(1);
}
}
}
fn client(url: &str) -> Result<(), nng::Error>
{
let mut s = Socket::new(Protocol::Req0)?;
s.dial(url)?;
println!("CLIENT: SENDING DATE REQUEST");
let mut req = Message::zeros(mem::size_of::<u64>())?;
LittleEndian::write_u64(&mut req, DATE_REQUEST);
s.send(req)?;
println!("CLIENT: WAITING FOR RESPONSE");
let res = s.recv()?;
let epoch = LittleEndian::read_u64(&res);
println!("CLIENT: UNIX EPOCH WAS {} SECONDS AGO", epoch);
Ok(())
}
fn server(url: &str) -> Result<(), nng::Error>
{
let mut s = Socket::new(Protocol::Rep0)?;
s.listen(url)?;
loop {
println!("SERVER: WAITING FOR COMMAND");
let mut msg = s.recv()?;
let cmd = LittleEndian::read_u64(&msg);
if cmd != DATE_REQUEST {
println!("SERVER: UNKNOWN COMMAND");
continue;
}
println!("SERVER: RECEIVED DATE REQUEST");
let rep = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.expect("Current system time is before Unix epoch")
.as_secs();
LittleEndian::write_u64(&mut msg, rep);
println!("SERVER: SENDING {}", rep);
s.send(msg)?;
}
}