rust-nex/src/prudp/server.rs

91 lines
2.7 KiB
Rust
Raw Normal View History

2025-01-19 14:14:48 +01:00
use std::{env, io, thread};
use std::io::Cursor;
2025-01-19 13:02:15 +01:00
use std::marker::PhantomData;
2025-01-19 14:34:02 +01:00
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, UdpSocket};
2025-01-19 13:02:15 +01:00
use std::ops::{Deref, DerefMut};
use std::sync::{Arc, Mutex};
2025-01-19 14:14:48 +01:00
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread::JoinHandle;
use once_cell::sync::Lazy;
2025-01-19 14:34:02 +01:00
use log::{error, info};
2025-01-19 14:14:48 +01:00
use crate::prudp::auth_module::AuthModule;
2025-01-19 13:02:15 +01:00
use crate::prudp::endpoint::Endpoint;
2025-01-19 14:14:48 +01:00
use crate::prudp::packet::PRUDPPacket;
static SERVER_DATAGRAMS: Lazy<u8> = Lazy::new(||{
env::var("SERVER_DATAGRAM_COUNT").ok()
.and_then(|s| s.parse().ok())
.unwrap_or(1)
});
2025-01-19 13:02:15 +01:00
pub struct NexServer{
pub endpoints: Mutex<Vec<Endpoint>>,
2025-01-19 14:14:48 +01:00
pub running: AtomicBool,
//pub auth_module: Arc<dyn AuthModule>
2025-01-19 13:02:15 +01:00
_no_outside_construction: PhantomData<()>
}
impl NexServer{
2025-01-19 14:14:48 +01:00
fn process_prudp_packet(&self, packet: &PRUDPPacket){
}
2025-01-19 14:34:02 +01:00
fn process_prudp_packets(&self, addr: SocketAddr, udp_message: &[u8]){
2025-01-19 14:14:48 +01:00
let mut stream = Cursor::new(udp_message);
while stream.position() as usize != udp_message.len() {
let packet = match PRUDPPacket::new(&mut stream){
Ok(p) => p,
Err(e) => {
error!("Somebody is fucking with the servers or their connection is bad(from {})", addr);
break;
},
};
2025-01-19 14:34:02 +01:00
info!("got valid prudp packet from someone({}): \n{:?}", addr, packet);
2025-01-19 14:14:48 +01:00
}
}
fn server_thread_entry(self: Arc<Self>, socket: Arc<UdpSocket>){
while self.running.load(Ordering::Relaxed) {
// yes we actually allow the max udp to be read lol
let mut msg_buffer = vec![0u8; 65507];
let (len, addr) = socket.recv_from(&mut msg_buffer)
.expect("Datagram thread crashed due to unexpected error from recv_from");
let current_msg = &msg_buffer[0..len];
2025-01-19 14:34:02 +01:00
self.process_prudp_packets(addr, current_msg);
2025-01-19 14:14:48 +01:00
}
2025-01-19 13:02:15 +01:00
}
2025-01-19 14:14:48 +01:00
pub fn new(addr: SocketAddrV4) -> io::Result<(Arc<Self>, JoinHandle<()>)>{
2025-01-19 13:02:15 +01:00
let own_impl = NexServer{
endpoints: Default::default(),
2025-01-19 14:14:48 +01:00
running: AtomicBool::new(true),
2025-01-19 13:02:15 +01:00
_no_outside_construction: Default::default()
};
let arc = Arc::new(own_impl);
2025-01-19 14:14:48 +01:00
let socket = Arc::new(UdpSocket::bind(addr)?);
2025-01-19 13:02:15 +01:00
2025-01-19 14:14:48 +01:00
let mut thread = None;
2025-01-19 13:02:15 +01:00
2025-01-19 14:14:48 +01:00
for _ in 0..*SERVER_DATAGRAMS {
let socket = socket.clone();
let server= arc.clone();
thread = Some(thread::spawn(move || {
server.server_thread_entry(socket);
}));
}
2025-01-19 13:02:15 +01:00
2025-01-19 14:14:48 +01:00
let thread = thread.expect("cannot have less than 1 thread for a server");
2025-01-19 13:02:15 +01:00
2025-01-19 14:14:48 +01:00
Ok((arc, thread))
}
}
2025-01-19 13:02:15 +01:00