client_net.rs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*! The networking methods for our client components to call. In
  2. particular, this file provides a send() method to handle connecting
  3. to a server process and sending it data. */
  4. use tokio::io::{AsyncReadExt, AsyncWriteExt};
  5. use tokio::net::TcpStream;
  6. // may need to change strings to byte vectors in the future
  7. pub async fn send(addr: String, payload: Vec<u8>) -> Vec<u8> {
  8. let mut stream = TcpStream::connect(&addr)
  9. .await
  10. .expect("Failed to create TcpStream");
  11. // send number of bytes in payload
  12. let payload_size = usize::to_be_bytes(payload.len());
  13. stream
  14. .write_all(&payload_size)
  15. .await
  16. .expect("Failed to write number of bytes to listen for");
  17. // send data
  18. stream
  19. .write_all(&payload)
  20. .await
  21. .expect("Failed to write data to stream");
  22. // get number of bytes in response
  23. let mut nbuf: [u8; 8] = [0; 8];
  24. stream
  25. .read(&mut nbuf)
  26. .await
  27. .expect("Failed to get number of bytes to read");
  28. let n = usize::from_be_bytes(nbuf);
  29. if n == 0 {
  30. return vec![0; 0];
  31. }
  32. // receive response
  33. let mut buf = vec![0; n];
  34. stream
  35. .read(&mut buf)
  36. .await
  37. .expect("Failed to read data from socket");
  38. buf
  39. }