mirror of
https://github.com/GIKExe/rust_mc_serv.git
synced 2025-06-24 10:22:57 +03:00
?
This commit is contained in:
parent
0c8942fa4d
commit
ef2b7893a5
35
src/data.rs
35
src/data.rs
@ -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 {
|
||||||
|
18
src/main.rs
18
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;
|
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()?;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user