This commit is contained in:
GIKExe 2025-05-07 03:21:05 +03:00
parent 0c8942fa4d
commit ef2b7893a5
2 changed files with 52 additions and 1 deletions

View File

@ -8,12 +8,47 @@ use crate::inet::InetError;
pub enum DataError { pub enum DataError {
ReadError, ReadError,
WriteError, WriteError,
VarIntIsSoBig,
StringDecodeError,
Inet(InetError), Inet(InetError),
} }
pub trait DataReader { pub trait DataReader {
fn read_bytes(&mut self, size: usize) -> Result<Vec<u8>, DataError>; fn read_bytes(&mut self, size: usize) -> Result<Vec<u8>, DataError>;
fn read_byte(&mut self) -> Result<u8, DataError> {
Ok(self.read_bytes(1)?[0])
}
fn read_byte_signed(&mut self) -> Result<i8, DataError> {
Ok(self.read_bytes(1)?[0] as i8)
}
fn read_short(&mut self) -> Result<u16, DataError> {
Ok((self.read_byte()? as u16) + ((self.read_byte()? as u16) << 8))
}
fn read_short_signed(&mut self) -> Result<i16, DataError> {
Ok(self.read_short()? as i16)
}
fn read_varint(&mut self) -> Result<i32, DataError> {
let mut value = 0;
let mut position = 0;
loop {
let byte = self.read_byte()?;
value |= ((byte & 0x7F) << position) as i32;
if (byte & 0x80) == 0 {return Ok(value)};
position += 7;
if position >= 32 {return Err(DataError::VarIntIsSoBig)};
}
}
fn read_string(&mut self) -> Result<String, DataError> {
let size = self.read_varint()?;
let vec = self.read_bytes(size as usize)?;
String::from_utf8(vec).map_err(|_| DataError::StringDecodeError)
}
} }
impl <R: Read> DataReader for R { impl <R: Read> DataReader for R {

View File

@ -1,5 +1,8 @@
use inet::Server; use std::{sync::Arc, time::Duration};
use data::{DataError, DataReader};
use inet::Server;
use tokio::{net::TcpStream, time::sleep};
@ -7,6 +10,7 @@ mod inet;
mod data; mod data;
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let Ok(server) = Server::new("127.0.0.1:25565").await else { let Ok(server) = Server::new("127.0.0.1:25565").await else {
@ -15,5 +19,17 @@ async fn main() {
loop { loop {
let stream = server.accept().await; let stream = server.accept().await;
tokio::spawn(test(Arc::new(stream)));
} }
}
async fn test(stream: Arc<TcpStream>) {
let Ok(addr) = stream.peer_addr() else {return;};
println!("Подключение: {addr}");
read_first_packet(stream.clone());
println!("Отключение: {addr}");
}
fn read_first_packet(stream: Arc<TcpStream>) -> Result<(), DataError>{
let size = stream.read_varint()?;
} }