From ef2b7893a596ea47892dea617e8546d58c946fc0 Mon Sep 17 00:00:00 2001 From: GIKExe <72767917+GIKExe@users.noreply.github.com> Date: Wed, 7 May 2025 03:21:05 +0300 Subject: [PATCH] ? --- src/data.rs | 35 +++++++++++++++++++++++++++++++++++ src/main.rs | 18 +++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/data.rs b/src/data.rs index f442f11..7c645b8 100644 --- a/src/data.rs +++ b/src/data.rs @@ -8,12 +8,47 @@ use crate::inet::InetError; pub enum DataError { ReadError, WriteError, + VarIntIsSoBig, + StringDecodeError, Inet(InetError), } pub trait DataReader { fn read_bytes(&mut self, size: usize) -> Result, DataError>; + fn read_byte(&mut self) -> Result { + Ok(self.read_bytes(1)?[0]) + } + + fn read_byte_signed(&mut self) -> Result { + Ok(self.read_bytes(1)?[0] as i8) + } + + fn read_short(&mut self) -> Result { + Ok((self.read_byte()? as u16) + ((self.read_byte()? as u16) << 8)) + } + + fn read_short_signed(&mut self) -> Result { + Ok(self.read_short()? as i16) + } + + fn read_varint(&mut self) -> Result { + 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 { + let size = self.read_varint()?; + let vec = self.read_bytes(size as usize)?; + String::from_utf8(vec).map_err(|_| DataError::StringDecodeError) + } } impl DataReader for R { diff --git a/src/main.rs b/src/main.rs index 387eaae..ec98674 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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; + #[tokio::main] async fn main() { let Ok(server) = Server::new("127.0.0.1:25565").await else { @@ -15,5 +19,17 @@ async fn main() { loop { let stream = server.accept().await; + tokio::spawn(test(Arc::new(stream))); } +} + +async fn test(stream: Arc) { + let Ok(addr) = stream.peer_addr() else {return;}; + println!("Подключение: {addr}"); + read_first_packet(stream.clone()); + println!("Отключение: {addr}"); +} + +fn read_first_packet(stream: Arc) -> Result<(), DataError>{ + let size = stream.read_varint()?; } \ No newline at end of file