progress towards udp
parent
8a5591c8bc
commit
9b8395806d
70
src/main.rs
70
src/main.rs
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue