2025-06-04 22:52:20 -06:00
|
|
|
use std::{
|
2025-06-12 05:44:54 -06:00
|
|
|
io::{BufReader, Read, Write},
|
2025-06-06 19:20:49 -06:00
|
|
|
net::{SocketAddr, TcpListener, TcpStream},
|
2025-06-10 06:12:18 -06:00
|
|
|
sync::{
|
|
|
|
|
Arc,
|
|
|
|
|
atomic::{AtomicBool, Ordering},
|
|
|
|
|
},
|
2025-06-04 22:52:20 -06:00
|
|
|
};
|
|
|
|
|
|
2025-06-09 12:37:49 -06:00
|
|
|
use crate::{
|
|
|
|
|
Error,
|
|
|
|
|
networkers::{ClientTrait, Connection, ServerTrait},
|
|
|
|
|
};
|
2025-06-04 22:52:20 -06:00
|
|
|
|
|
|
|
|
pub struct TCPConnection {
|
|
|
|
|
stream: TcpStream,
|
|
|
|
|
reader: BufReader<TcpStream>,
|
2025-06-10 06:12:18 -06:00
|
|
|
is_alive: Arc<AtomicBool>,
|
2025-06-04 22:52:20 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Connection for TCPConnection {
|
2025-06-06 19:20:49 -06:00
|
|
|
fn get_info(&self) -> String {
|
|
|
|
|
format!(
|
|
|
|
|
"tcp://{}",
|
|
|
|
|
if let Ok(addr) = &self.stream.peer_addr() {
|
|
|
|
|
addr.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
"ERROR".to_string()
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn is_alive(&self) -> bool {
|
2025-06-10 06:12:18 -06:00
|
|
|
self.is_alive.load(Ordering::Relaxed)
|
2025-06-06 19:20:49 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 05:44:54 -06:00
|
|
|
fn read(&mut self) -> Result<Vec<u8>, Error> {
|
|
|
|
|
let mut len_bytes = [0u8; 4];
|
2025-06-06 19:20:49 -06:00
|
|
|
|
2025-06-12 05:44:54 -06:00
|
|
|
if let Err(e) = self.reader.read_exact(&mut len_bytes) {
|
2025-06-10 06:12:18 -06:00
|
|
|
self.is_alive.swap(false, Ordering::Relaxed);
|
2025-06-12 05:44:54 -06:00
|
|
|
return Err(format!("Stream disconnected! ({})", e).into());
|
2025-06-06 19:20:49 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 05:44:54 -06:00
|
|
|
let len = u32::from_be_bytes(len_bytes) as usize;
|
|
|
|
|
|
|
|
|
|
let mut buffer = vec![0u8; len];
|
|
|
|
|
|
|
|
|
|
// In case the
|
|
|
|
|
match self.reader.read_exact(&mut buffer) {
|
|
|
|
|
Ok(()) => Ok(buffer.to_vec()),
|
|
|
|
|
Err(e) => {
|
|
|
|
|
self.is_alive.swap(false, Ordering::Relaxed);
|
|
|
|
|
Err(format!("Stream disconnected! ({})", e).into())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// let mut buf = Vec::new();
|
|
|
|
|
// let n = self.reader.read(&mut buf)?;
|
2025-06-10 06:12:18 -06:00
|
|
|
|
2025-06-12 05:44:54 -06:00
|
|
|
// Stream sends a null buffer if it is disconnected
|
|
|
|
|
// if n == 0 {
|
|
|
|
|
// self.is_alive.swap(false, Ordering::Relaxed);
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// println!("Recieved: {}", line.trim_end().to_string());
|
2025-06-04 22:52:20 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 05:44:54 -06:00
|
|
|
fn write(&mut self, data: &[u8]) -> Result<(), Error> {
|
|
|
|
|
let len = data.len() as u32;
|
|
|
|
|
self.stream.write_all(&len.to_be_bytes())?;
|
|
|
|
|
self.stream.write_all(data)?;
|
2025-06-06 19:20:49 -06:00
|
|
|
self.stream.flush()?;
|
|
|
|
|
Ok(())
|
2025-06-04 22:52:20 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-10 06:12:18 -06:00
|
|
|
fn try_clone(&self) -> Result<Box<dyn Connection + Send + Sync>, Error> {
|
|
|
|
|
Ok(Box::new(Self {
|
|
|
|
|
stream: self.stream.try_clone()?,
|
|
|
|
|
reader: BufReader::new(self.stream.try_clone()?),
|
|
|
|
|
is_alive: Arc::clone(&self.is_alive),
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-08 17:16:08 -06:00
|
|
|
|
2025-06-04 22:52:20 -06:00
|
|
|
pub struct TCPServer {
|
|
|
|
|
listener: TcpListener,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl ServerTrait<TCPConnection> for TCPServer {
|
2025-06-06 19:20:49 -06:00
|
|
|
fn get_info(&self) -> String {
|
|
|
|
|
format!(
|
|
|
|
|
"tcp://{}",
|
|
|
|
|
if let Ok(addr) = &self.listener.local_addr() {
|
|
|
|
|
addr.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
"ERROR".to_string()
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-09 12:37:49 -06:00
|
|
|
fn accept(&self) -> Result<TCPConnection, Error> {
|
2025-06-04 22:52:20 -06:00
|
|
|
let (stream, _) = self.listener.accept()?;
|
|
|
|
|
let reader = BufReader::new(stream.try_clone()?);
|
2025-06-06 19:20:49 -06:00
|
|
|
Ok(TCPConnection {
|
|
|
|
|
stream,
|
|
|
|
|
reader,
|
2025-06-10 06:12:18 -06:00
|
|
|
is_alive: Arc::new(AtomicBool::new(true)),
|
2025-06-06 19:20:49 -06:00
|
|
|
})
|
2025-06-04 22:52:20 -06:00
|
|
|
}
|
|
|
|
|
|
2025-06-09 12:37:49 -06:00
|
|
|
fn bind(address: &SocketAddr) -> Result<Self, Error> {
|
2025-06-04 22:52:20 -06:00
|
|
|
let listener = TcpListener::bind(address)?;
|
|
|
|
|
Ok(Self { listener })
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub struct TCPClient;
|
|
|
|
|
|
|
|
|
|
impl ClientTrait<TCPConnection> for TCPClient {
|
2025-06-09 12:37:49 -06:00
|
|
|
fn connect(address: &SocketAddr) -> Result<TCPConnection, Error> {
|
2025-06-04 22:52:20 -06:00
|
|
|
let stream = TcpStream::connect(address)?;
|
|
|
|
|
let reader = BufReader::new(stream.try_clone()?);
|
2025-06-06 19:20:49 -06:00
|
|
|
let conn = TCPConnection {
|
|
|
|
|
stream,
|
|
|
|
|
reader,
|
2025-06-10 06:12:18 -06:00
|
|
|
is_alive: Arc::new(AtomicBool::new(true)),
|
2025-06-06 19:20:49 -06:00
|
|
|
};
|
|
|
|
|
Ok(conn)
|
2025-06-04 22:52:20 -06:00
|
|
|
}
|
|
|
|
|
}
|