Semi working multi client system

This commit is contained in:
2025-08-13 21:30:52 +02:00
parent a3884092ba
commit ecfb279fcd
3 changed files with 43 additions and 26 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ impl GhostClient {
pub fn read_bytes(&mut self, size: usize) -> std::io::Result<Vec<u8>> { pub fn read_bytes(&mut self, size: usize) -> std::io::Result<Vec<u8>> {
let mut buf = vec![0u8; size]; let mut buf = vec![0u8; size];
let n = self.0.read(&mut buf)?; let n = self.read(&mut buf)?;
buf.truncate(n); buf.truncate(n);
Ok(buf) Ok(buf)
} }
+6 -2
View File
@@ -5,6 +5,10 @@ fn main() {
let mut con = GhostClient::connect("0.0.0.0:443", (0, 0, 0, 0), 7525).unwrap(); let mut con = GhostClient::connect("0.0.0.0:443", (0, 0, 0, 0), 7525).unwrap();
con.send("Hello from client!".as_bytes()).unwrap(); con.send("Hello from client!".as_bytes()).unwrap();
let response = con.read_bytes(1024).unwrap(); let response = con.read_bytes(1024).unwrap();
println!("From server: {}", String::from_utf8(response).unwrap()); println!(
println!("From server 2: {:?}", con.read_bytes(1024).unwrap()); "From server: {} ({response:?})",
String::from_utf8(response.clone()).unwrap(),
);
// println!("From server 2: {:?}", con.read_bytes(1024).unwrap());
// println!("From server 3: {:?}", con.read_bytes(1024).unwrap());
} }
+28 -15
View File
@@ -1,28 +1,50 @@
use std::{ use std::{
io::{Read, Write}, io::{Read, Write},
net::{TcpListener, TcpStream}, net::{TcpListener, TcpStream},
sync::{Arc, Mutex},
}; };
use crate::{format_ip_bytes, route_tcp, route_tcp2}; use crate::{format_ip_bytes, route_tcp, route_tcp2};
pub fn router() { pub fn router() {
let server = TcpListener::bind("0.0.0.0:443").unwrap(); let server = TcpListener::bind("0.0.0.0:443").unwrap();
let mut clients: Vec<TcpStream> = Vec::new(); let clients: Arc<Mutex<Vec<TcpStream>>> = Arc::new(Mutex::new(Vec::new()));
for stream in server.incoming() { for stream in server.incoming() {
match stream { match stream {
Ok(mut client_recv) => { Ok(mut client_recv) => {
let clients = clients.clone();
std::thread::spawn(move || {
let mut addr = [0; 6]; let mut addr = [0; 6];
client_recv.read_exact(&mut addr).unwrap(); client_recv.read_exact(&mut addr).unwrap();
clients.push(client_recv.try_clone().unwrap()); clients
.lock()
.unwrap()
.push(client_recv.try_clone().unwrap());
let i = clients.len().wrapping_sub(2); let i = clients.lock().unwrap().len().wrapping_sub(2);
let mut using_router = false;
let mut server_recv = if let Some(server_recv) = clients.lock().unwrap().get(i)
{
server_recv.try_clone().unwrap()
} else {
using_router = true;
TcpStream::connect(format_ip_bytes(addr)).unwrap()
};
if let Some(server_recv) = clients.get_mut(i) {
let mut server_send = server_recv.try_clone().unwrap(); let mut server_send = server_recv.try_clone().unwrap();
let mut client_send = client_recv.try_clone().unwrap(); let mut client_send = client_recv.try_clone().unwrap();
if using_router {
std::thread::spawn(move || {
while !route_tcp(&mut client_recv, &mut server_send).unwrap() {}
});
while !route_tcp(&mut server_recv, &mut client_send).unwrap() {}
} else {
server_send server_send
.write_all(&[&[1u8], &addr[..]].concat()) .write_all(&[&[1u8], &addr[..]].concat())
.unwrap(); .unwrap();
@@ -31,18 +53,9 @@ pub fn router() {
while !route_tcp2(&mut client_recv, &mut server_send).unwrap() {} while !route_tcp2(&mut client_recv, &mut server_send).unwrap() {}
}); });
while !route_tcp2(server_recv, &mut client_send).unwrap() {} while !route_tcp2(&mut server_recv, &mut client_send).unwrap() {}
} else {
let mut server_recv = TcpStream::connect(format_ip_bytes(addr)).unwrap();
let mut server_send = server_recv.try_clone().unwrap();
let mut client_send = client_recv.try_clone().unwrap();
std::thread::spawn(move || {
while !route_tcp(&mut client_recv, &mut server_send).unwrap() {}
});
while !route_tcp(&mut server_recv, &mut client_send).unwrap() {}
} }
});
} }
Err(_) => {} Err(_) => {}
} }