A simple echo server (init)
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
Generated
+7
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nocloud-core"
|
||||||
|
version = "0.1.0"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "nocloud-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Статус разработки проекта
|
||||||
|
|
||||||
|
## 📌 Текущее состояние
|
||||||
|
* **Где остановился:** Сервер успешно запускается и слушает сетевой сокет.
|
||||||
|
* **Проблема:** Не удалось проверить эхо-ответ через PowerShell.
|
||||||
|
* **Следующий шаг:** Найти рабочий способ отправки тестового запроса в PowerShell или использовать альтернативный инструмент.
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
use std::{env, io::{self, Read, Write}, net::{TcpListener, TcpStream}, thread};
|
||||||
|
|
||||||
|
fn handle_client (mut stream: TcpStream) {
|
||||||
|
let peer_addr = stream
|
||||||
|
.peer_addr()
|
||||||
|
.map_or_else(|_| "uncnown".to_string(), |addr| addr.to_string());
|
||||||
|
println!("Handling connection from: {}", peer_addr);
|
||||||
|
|
||||||
|
let mut buffer = [0;1024];
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match stream.read(&mut buffer) {
|
||||||
|
Ok(n) => {
|
||||||
|
if n ==0 {
|
||||||
|
println!("client {} closed connection",peer_addr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err (e) = stream.write_all(&buffer) {
|
||||||
|
eprintln!("Write error to client {}: {}", peer_addr, e
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(e) if e.kind() == io::ErrorKind::Interrupted => continue,
|
||||||
|
Err(e) => {
|
||||||
|
match e.kind() {
|
||||||
|
io::ErrorKind::ConnectionReset => {
|
||||||
|
println!("Клиент {} Сбросил соединение", peer_addr);
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
eprintln!("Read Error frop client {}: {}",
|
||||||
|
peer_addr,
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let addr = env::args()
|
||||||
|
.nth(1)
|
||||||
|
.unwrap_or_else(||"127.0.0.1:32768".to_string());
|
||||||
|
|
||||||
|
let listener = TcpListener::bind(&addr)
|
||||||
|
.expect("Failed to bind to address");
|
||||||
|
println!("Server listening om {}", addr);
|
||||||
|
|
||||||
|
for stream_result in listener.incoming() {
|
||||||
|
match stream_result {
|
||||||
|
Ok(stream) => {
|
||||||
|
thread::spawn(move || {
|
||||||
|
handle_client(stream);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Failed to accept connection {}",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user