respect server error
This commit is contained in:
parent
86e519ed63
commit
2eb187a8c1
28
src/data.rs
28
src/data.rs
@ -1,13 +1,13 @@
|
|||||||
use std::{error::Error, fmt::Display};
|
use std::{error::Error, fmt::Display};
|
||||||
|
|
||||||
|
use rust_mc_proto::ProtocolError;
|
||||||
|
|
||||||
|
// Ошибки сервера
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ServerError {
|
pub enum ServerError {
|
||||||
ReadPacketError,
|
UnknownPacket(String),
|
||||||
ConnectionClosedError,
|
Protocol(ProtocolError),
|
||||||
ReadError,
|
ConnectionClosed
|
||||||
BindError,
|
|
||||||
VarIntIsTooBig,
|
|
||||||
PacketIsEnd
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for ServerError {
|
impl Display for ServerError {
|
||||||
@ -17,3 +17,19 @@ impl Display for ServerError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Error for ServerError {}
|
impl Error for ServerError {}
|
||||||
|
|
||||||
|
// Делаем чтобы ProtocolError мог переделываться в наш ServerError
|
||||||
|
impl From<ProtocolError> for ServerError {
|
||||||
|
fn from(error: ProtocolError) -> ServerError {
|
||||||
|
match error {
|
||||||
|
// Если просто закрыто соединение, пеерделываем в нашу ошибку этого
|
||||||
|
ProtocolError::ConnectionClosedError => {
|
||||||
|
ServerError::ConnectionClosed
|
||||||
|
},
|
||||||
|
// Все остальное просто засовываем в обертку
|
||||||
|
error => {
|
||||||
|
ServerError::Protocol(error)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
src/main.rs
18
src/main.rs
@ -1,8 +1,10 @@
|
|||||||
use std::{error::Error, io::{Read, Write}, net::TcpListener, thread, time::Duration};
|
use std::{io::{Read, Write}, net::TcpListener, thread, time::Duration};
|
||||||
|
|
||||||
use pohuy::Pohuy;
|
|
||||||
use rust_mc_proto::{DataReader, DataWriter, MinecraftConnection, Packet};
|
use rust_mc_proto::{DataReader, DataWriter, MinecraftConnection, Packet};
|
||||||
|
|
||||||
|
use data::ServerError;
|
||||||
|
use pohuy::Pohuy;
|
||||||
|
|
||||||
pub mod pohuy;
|
pub mod pohuy;
|
||||||
pub mod data;
|
pub mod data;
|
||||||
|
|
||||||
@ -37,11 +39,13 @@ fn main() {
|
|||||||
|
|
||||||
fn handle_connection(
|
fn handle_connection(
|
||||||
mut conn: MinecraftConnection<impl Read + Write> // Подключение
|
mut conn: MinecraftConnection<impl Read + Write> // Подключение
|
||||||
) -> Result<(), Box<dyn Error>> {
|
) -> Result<(), ServerError> {
|
||||||
// Чтение рукопожатия
|
// Чтение рукопожатия
|
||||||
let mut packet = conn.read_packet()?;
|
let mut packet = conn.read_packet()?;
|
||||||
|
|
||||||
if packet.id() != 0x00 { return Ok(()); } // Айди пакета не рукопожатное - выходим из функции
|
if packet.id() != 0x00 {
|
||||||
|
return Err(ServerError::UnknownPacket(format!("Неизвестный пакет рукопожатия")));
|
||||||
|
} // Айди пакета не рукопожатное - выходим из функции
|
||||||
|
|
||||||
let protocol_version = packet.read_varint()?; // Получаем версия протокола, может быть отрицательным если наш клиент дэбил
|
let protocol_version = packet.read_varint()?; // Получаем версия протокола, может быть отрицательным если наш клиент дэбил
|
||||||
let server_address = packet.read_string()?; // Получаем домен/адрес сервера к которому пытается подключиться клиент, например "play.example.com", а не айпи
|
let server_address = packet.read_string()?; // Получаем домен/адрес сервера к которому пытается подключиться клиент, например "play.example.com", а не айпи
|
||||||
@ -92,7 +96,7 @@ fn handle_connection(
|
|||||||
// ID такой-же, содержание тоже, так почему бы и нет?
|
// ID такой-же, содержание тоже, так почему бы и нет?
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
break;
|
return Err(ServerError::UnknownPacket(format!("Неизвестный пакет при чтении запросов статуса")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,7 +111,9 @@ fn handle_connection(
|
|||||||
// TODO: Чтение Configuration (возможно с примешиванием Listener'ов)
|
// TODO: Чтение Configuration (возможно с примешиванием Listener'ов)
|
||||||
// TODO: Обработчик пакетов Play (тоже трейт), который уже будет дергать Listener'ы
|
// TODO: Обработчик пакетов Play (тоже трейт), который уже будет дергать Listener'ы
|
||||||
},
|
},
|
||||||
_ => {} // Тип подключения не рукопожатный
|
_ => {
|
||||||
|
return Err(ServerError::UnknownPacket(format!("Неизвестный NextState при рукопожатии")));
|
||||||
|
} // Тип подключения не рукопожатный
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
Loading…
Reference in New Issue
Block a user