/*! 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; // may need to change strings to byte vectors in the future pub async fn send(addr: String, payload: Vec) -> Vec { let mut stream = TcpStream::connect(&addr) .await .expect("Failed to create TcpStream"); // send number of bytes in payload let payload_size = usize::to_be_bytes(payload.len()); stream .write_all(&payload_size) .await .expect("Failed to write number of bytes to listen for"); // send data stream .write_all(&payload) .await .expect("Failed to write data to stream"); // get number of bytes in response let mut nbuf: [u8; 8] = [0; 8]; stream .read(&mut nbuf) .await .expect("Failed to get number of bytes to read"); let n = usize::from_be_bytes(nbuf); if n == 0 { return vec![0; 0]; } // receive response let mut buf = vec![0; n]; stream .read(&mut buf) .await .expect("Failed to read data from socket"); buf }