Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. use serde::{Deserialize, Serialize};
  2. use std::io::{BufRead, BufReader};
  3. use std::net::{TcpListener, TcpStream};
  4. use std::sync::{Arc, Mutex};
  5. use std::thread;
  6. use std::vec::Vec;
  7.  
  8. #[derive(Debug)]
  9. struct ServerData {
  10. version: usize,
  11. clients: Mutex<Vec<Option<Client>>>,
  12. next_id: Mutex<usize>,
  13. }
  14.  
  15. #[derive(Serialize, Deserialize, Debug)]
  16. struct Packet {
  17. number: usize,
  18. version: usize,
  19. source: String,
  20. dest: String,
  21. verb: String,
  22. data: String,
  23. }
  24.  
  25. #[derive(Debug)]
  26. struct Client {
  27. stream: Option<TcpStream>,
  28. username: String,
  29. id: usize,
  30. version: usize,
  31. }
  32.  
  33. fn handle_client(mut stream: TcpStream, server: Arc<ServerData>) -> Result<(), std::io::Error> {
  34. let mut data = Vec::new();
  35. let mut reader = BufReader::new(stream);
  36.  
  37. loop {
  38. data.clear();
  39. // clear our data buffer to read into
  40.  
  41. let bytes_read = reader.read_until(b'\n', &mut data)?;
  42. // read until we hit a newline character
  43. if bytes_read == 0 {
  44. return Ok(());
  45. } // close the stream if there are no bytes left to read
  46.  
  47. let packet: Packet = serde_json::from_slice(&data)?;
  48. if packet.version != server.version {
  49. return Ok(());
  50. } // close the stream if the packet version is different
  51.  
  52. match packet.verb.as_ref() {
  53. "LOGN" => {
  54. let new_client = Client {
  55. stream: Some(stream),
  56. username: packet.source,
  57. id: server.next_id.lock()?,
  58. version: packet.version,
  59. };
  60. }
  61. "GDBY" => {}
  62. _ => Err(()),
  63. }
  64. println!("{:#?}", packet);
  65. }
  66. }
  67.  
  68. fn main() -> Result<(), std::io::Error> {
  69. let listener = TcpListener::bind("127.0.0.1:59444")?;
  70. let server = Arc::new(ServerData {
  71. version: 1,
  72. clients: Mutex::new(vec![None]),
  73. next_id: Mutex::new(1),
  74. });
  75. println!("Server listening on port 59444");
  76. for stream in listener.incoming() {
  77. match stream {
  78. Ok(stream) => {
  79. let server = server.clone();
  80. println!("New connection: {}", stream.peer_addr()?);
  81. thread::spawn(move || {
  82. handle_client(stream, server)
  83. // connection succeeded
  84. });
  85. }
  86. Err(e) => {
  87. println!("Error: {}", e);
  88. return Err(e);
  89. // connection failed
  90. }
  91. }
  92. }
  93. // close the socket server
  94. drop(listener);
  95. Ok(())
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement