diff --git a/src/bin/lox_client.rs b/src/bin/lox_client.rs index 00677c1..e097afb 100644 --- a/src/bin/lox_client.rs +++ b/src/bin/lox_client.rs @@ -1,11 +1,26 @@ +// This seems like probably not the best way to do this, but it works. +#[path = "../client_net.rs"] +mod client_net; +use crate::client_net::send; + use ed25519_dalek::PublicKey; use lox::IssuerPubKey; +use std::env::args; use std::fs::File; -fn main() { +#[tokio::main] +async fn main() { let bridgedb_pubkey_filename = "bridgedb_pubkey.json"; let lox_auth_pubkeys_filename = "lox_auth_pubkeys.json"; + // TODO: make argument passing nicer (maybe flags, config files, etc.) + + // network address to connect to, e.g., localhost:8080 + let addr = args().nth(1).unwrap(); + + // message to send + let msg = args().nth(2).unwrap(); + // import bridgedb pubkey let bridgedb_pubkey_infile = File::open(bridgedb_pubkey_filename).unwrap(); let bridgedb_pubkey: PublicKey = serde_json::from_reader(bridgedb_pubkey_infile).unwrap(); @@ -19,4 +34,8 @@ fn main() { let migrationkey_pub = &lox_auth_pubkeys[2]; let reachability_pub = &lox_auth_pubkeys[3]; let invitation_pub = &lox_auth_pubkeys[4]; + + let s = send(addr, msg).await; + + println!("{}", s); } diff --git a/src/client_net.rs b/src/client_net.rs new file mode 100644 index 0000000..0afe21c --- /dev/null +++ b/src/client_net.rs @@ -0,0 +1,36 @@ +/*! The networking methods for our client components to call. In +particular, this file provides a send() method to handle connecting +to a server process and sending it data. */ + +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; + +use std::str; + +// may need to change strings to byte vectors in the future +pub async fn send(addr: String, str: String) -> String { + let mut stream = TcpStream::connect(&addr) + .await + .expect("Failed to create TcpStream"); + + // send data + stream + .write_all(str.as_bytes()) + .await + .expect("Failed to write data to stream"); + + // read response + let mut buf = vec![0; 1024]; + let n = stream + .read(&mut buf) + .await + .expect("Failed to read data from socket"); + + if n == 0 { + return "".to_string(); + } + + str::from_utf8(&buf[0..n]) + .expect("Invalid UTF-8 sequence") + .to_string() +}