progress towards udp

main
Kyle Johnsen 2022-01-18 10:27:36 -05:00
parent 8a5591c8bc
commit 9b8395806d
1 changed files with 58 additions and 14 deletions

View File

@ -1,6 +1,6 @@
use std::io::prelude::*; use std::io::prelude::*;
use std::thread; use std::thread;
use std::net::{TcpListener, TcpStream}; use std::net::{TcpListener, TcpStream,UdpSocket,IpAddr};
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::{Arc,Mutex}; use std::sync::{Arc,Mutex};
use std::sync::mpsc; use std::sync::mpsc;
@ -13,7 +13,9 @@ struct Client {
sender: SyncSender<Vec<u8>>, sender: SyncSender<Vec<u8>>,
rooms_mutex: Arc<Mutex<HashMap<String,Arc<Room>>>>, rooms_mutex: Arc<Mutex<HashMap<String,Arc<Room>>>>,
clients_mutex: Arc<Mutex<HashMap<u32,Arc<Client>>>>, clients_mutex: Arc<Mutex<HashMap<u32,Arc<Client>>>>,
groups: Arc<Mutex<HashMap<String,Vec<Arc<Client>>>>> groups: Arc<Mutex<HashMap<String,Vec<Arc<Client>>>>>,
ip: Arc<Mutex<IpAddr>>,
port: Arc<Mutex<u16>>
} }
struct Room { struct Room {
@ -21,9 +23,7 @@ struct Room {
clients: Mutex<HashMap<u32,Arc<Client>>> clients: Mutex<HashMap<u32,Arc<Client>>>
} }
fn udp_listen(){
println!("UDP Thread Started");
}
fn read_u8(stream: &mut TcpStream) -> u8 { fn read_u8(stream: &mut TcpStream) -> u8 {
let mut buf = [0; 1]; let mut buf = [0; 1];
@ -312,7 +312,9 @@ fn handle_client(stream: TcpStream, client_id: u32, clients_mutex: Arc<Mutex<Has
sender: tx, sender: tx,
rooms_mutex: rooms_mutex.clone(), rooms_mutex: rooms_mutex.clone(),
clients_mutex: clients_mutex.clone(), clients_mutex: clients_mutex.clone(),
groups: Arc::new(Mutex::new(HashMap::new())) groups: Arc::new(Mutex::new(HashMap::new())),
ip: Arc::new(Mutex::new(stream.peer_addr().unwrap().ip())),
port: Arc::new(Mutex::new(0))
}); });
{ {
@ -351,14 +353,10 @@ fn handle_client(stream: TcpStream, client_id: u32, clients_mutex: Arc<Mutex<Has
} }
fn tcp_listen(){ fn tcp_listen(client_mutex: Arc<Mutex<HashMap<u32, Arc<Client>>>>, room_mutex: Arc<Mutex<HashMap<String,Arc<Room>>>>){
println!("Started TCP Listener"); println!("Started TCP Listener");
let listener = TcpListener::bind("127.0.0.1:80").expect("could not bind port"); let listener = TcpListener::bind("127.0.0.1:80").expect("could not bind port");
let clients: HashMap<u32, Arc<Client>> = HashMap::new();
let rooms: HashMap<String, Arc<Room>> = HashMap::new();
let client_mutex = Arc::new(Mutex::new(clients));
let room_mutex = Arc::new(Mutex::new(rooms));
let mut next_client_id = 0; let mut next_client_id = 0;
// accept connections and process them serially // accept connections and process them serially
for stream in listener.incoming() { for stream in listener.incoming() {
@ -369,13 +367,59 @@ fn tcp_listen(){
} }
} }
fn udp_listen(client_mutex: Arc<Mutex<HashMap<u32, Arc<Client>>>>, _room_mutex: Arc<Mutex<HashMap<String,Arc<Room>>>>){
let mut buf = [0u8;1024];
let s = UdpSocket::bind("127.0.0.1:80").unwrap();
println!("UDP Thread Started");
loop {
let (packet_size,addr) = s.recv_from(&mut buf).unwrap();
println!("Got a UDP packet of size {}",packet_size);
let t = buf[0];
if packet_size > 5{
//get the client id, which has to be sent with every udp message, because you don't know where udp messages are coming from
let client_id_bytes = [buf[1],buf[2],buf[3],buf[4]];
let client_id = u32::from_be_bytes(client_id_bytes);
if t == 0 {
//connect message, respond back
{
let clients = client_mutex.lock().unwrap();
let client = clients.get(&client_id).unwrap();
let mut port = client.port.lock().unwrap();
*port = addr.port(); //set the udp port to send data to
s.send_to(&buf,addr).unwrap(); //echo back
}
} else if t == 3 {
}
}
}
}
fn main() { fn main() {
println!("VelNet Server Starting"); println!("VelNet Server Starting");
let clients: HashMap<u32, Arc<Client>> = HashMap::new();
let rooms: HashMap<String, Arc<Room>> = HashMap::new();
let client_mutex = Arc::new(Mutex::new(clients));
let room_mutex = Arc::new(Mutex::new(rooms));
//start the UDP thread //start the UDP thread
let udp_handle = thread::spawn(udp_listen); let udp_clients = Arc::clone(&client_mutex);
let udp_rooms = Arc::clone(&room_mutex);
let udp_handle = thread::spawn(move ||{udp_listen(udp_clients, udp_rooms);});
//start the TCP thread //start the TCP thread
tcp_listen(); tcp_listen(client_mutex, room_mutex);
udp_handle.join().unwrap(); udp_handle.join().unwrap();
println!("VelNet Ended"); println!("VelNet Ended");
} }