Advertisement
Guest User

Untitled

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