Guest User

Untitled

a guest
May 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.65 KB | None | 0 0
  1. use std::thread::spawn;
  2. use std::net::{TcpListener, TcpStream};
  3. use std::time::Duration;
  4. use std::sync::{Mutex, Arc};
  5. use std::io::ErrorKind;
  6. use std::io::{Read, Write};
  7.  
  8. enum WriteType {
  9. Encode,
  10. Decode
  11. }
  12.  
  13. fn main() {
  14. let listener = TcpListener::bind("127.0.0.1:2001").unwrap();
  15.  
  16. for stream in listener.incoming() {
  17. let stream = stream.unwrap();
  18. stream.set_nonblocking(true).unwrap();
  19.  
  20. println!("Connection established!");
  21. spawn(|| {
  22. handle_stream(stream);
  23. });
  24. }
  25. }
  26.  
  27. fn handle_stream(mut browser: TcpStream) {
  28. let addr = "77.82.230.220:90".parse().unwrap();
  29. let timeout = Duration::from_secs(15);
  30. let mut server = TcpStream::connect_timeout(&addr, timeout)
  31. .expect("connection timed out");
  32. server.set_nonblocking(true);
  33. let server_ptr = &mut server;
  34. let browser_ptr = &mut browser;
  35.  
  36. let server_mutex = Arc::new(Mutex::new(server_ptr));
  37. let browser_mutex = Arc::new(Mutex::new(browser_ptr));
  38.  
  39. let server_clone = Arc::clone(&server_mutex);
  40. let browser_clone = Arc::clone(&browser_mutex);
  41.  
  42. let handle1 = copy(&server_clone, &browser_clone, WriteType::Encode);
  43. let handle2 = copy(&browser_clone, &server_clone, WriteType::Decode);
  44.  
  45. handle1.join();
  46. handle2.join();
  47. }
  48.  
  49. fn encode(data: &[u8]) -> Vec<u8> {
  50. let mut retval: Vec<u8>;
  51. for t in data {
  52. let byte = *t;
  53. let d = if byte < 12u8 { byte + 244u8 } else { byte - 12u8 };
  54. retval.push(d);
  55. }
  56. retval
  57. }
  58.  
  59. fn decode(data: &mut [u8]) -> Vec<u8> {
  60. let mut retval: Vec<u8>;
  61. for t in data {
  62. let byte = *t;
  63. let d = if byte > 243u8 { byte - 244u8 } else { byte + 12u8 };
  64. retval.push(d);
  65. }
  66. retval
  67. }
  68.  
  69. fn copy(from: &Arc<Mutex<&mut TcpStream>>,
  70. to: &Arc<Mutex<&mut TcpStream>>,
  71. write_type: WriteType) -> std::thread::JoinHandle<()> {
  72.  
  73. spawn(move || {
  74. let mut buf = [0u8;4096];
  75. loop {
  76. let mut count = 0;
  77. {
  78. let mut from_guard = from.lock().unwrap();
  79. match from_guard.read(&mut buf) {
  80. Ok(c) => { count = c },
  81. Err(ref e) if e.kind() == ErrorKind::WouldBlock => { },
  82. Err(_) => { break }
  83. };
  84. }
  85. if count > 0 {
  86. let result = match write_type {
  87. WriteType::Encode => encode(&mut buf[0..count]),
  88. WriteType::Decode => decode(&mut buf[0..count])
  89. };
  90. let mut to_guard = to.lock().unwrap();
  91. to_guard.write(&result).unwrap();
  92. to_guard.flush();
  93. }
  94. }
  95. })
  96. }
Add Comment
Please, Sign In to add comment