use env_logger;
use futures::{AsyncReadExt, AsyncWriteExt};
use std::process;
fn usage() -> ! {
println!("Usage: utp [-s|-c] <address> <port>");
process::exit(1);
}
#[async_std::main]
async fn main() {
use async_std_utp::UtpStream;
use std::io::{stderr, stdin, stdout, Read, Write};
enum Mode {
Server,
Client,
}
env_logger::init();
let mut args = std::env::args();
args.next();
let mode: Mode = match args.next() {
Some(ref s) if s == "-s" => Mode::Server,
Some(ref s) if s == "-c" => Mode::Client,
_ => usage(),
};
let addr = match (args.next(), args.next()) {
(None, None) => "127.0.0.1:8080".to_owned(),
(Some(ip), Some(port)) => format!("{}:{}", ip, port),
_ => usage(),
};
let addr: &str = &addr;
match mode {
Mode::Server => {
let mut stream = UtpStream::bind(addr).await.expect("Error binding stream");
let mut writer = stdout();
let _ = writeln!(&mut stderr(), "Serving on {}", addr);
let mut payload = vec![0; 1024 * 1024];
loop {
match stream.read(&mut payload).await {
Ok(0) => break,
Ok(read) => writer
.write(&payload[..read])
.expect("Error writing to stdout"),
Err(e) => panic!("{}", e),
};
}
}
Mode::Client => {
let mut stream = UtpStream::connect(addr)
.await
.expect("Error connecting to remote peer");
let mut reader = stdin();
let mut payload = vec![0; 1024 * 1024];
loop {
match reader.read(&mut payload) {
Ok(0) => break,
Ok(read) => stream
.write(&payload[..read])
.await
.expect("Error writing to stream"),
Err(e) => {
stream.close().await.expect("Error closing stream");
panic!("{:?}", e);
}
};
}
stream.close().await.expect("Error closing stream");
}
}
}