1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
use std::thread;
use std::time::Duration;
use std::io::{self, Read, Write};
use std::net::{TcpListener, TcpStream};
const BUFSIZE: usize = 512;
fn handle_clients(mut stream: TcpStream) {
let mut buffer = [0u8; BUFSIZE];
loop {
match stream.read(&mut buffer) {
Ok(0) => {
/*
* Si la lecture retourne 0, cela signifie que le client
* a fermé la connexion
*/
println!("[+]Info:Client {} déconnecté.",
stream.peer_addr().expect(
"[-]Erreur serveur connexions"),);
/*
* votre erreur est ici il faut une fermeture
* de la connexion (implicite par le break)
* qui close la socket
*/
break; /* close socket */
}
Ok(nbyte) => {
/* Traitement des données reçues du client */
print!(
"[+]Réception des données: {} {} bytes => Message:{}",
stream.peer_addr().expect(
"[-]Erreur serveur connexions"),
nbyte, String::from_utf8_lossy(&buffer));
println!("\t Bytes = {:?}", &buffer[..nbyte]);
/* Répond au client */
if let Err(error) = stream.write_all(&buffer[..nbyte]) {
println!("[-]Échec de l'envoi de la réponse : {}",
error);
break;
}
}
Err(ref error) if error.kind() == io::ErrorKind::WouldBlock => {
/* si le socket est non-bloquant,
* continuez à écouter
*/
thread::sleep(Duration::from_millis(100));
continue;
}
Err(ref error) if error.kind() == io::ErrorKind::ConnectionAborted => {
/* si déconnexion du client détectée afficher */
print!("[+]La connexion du client a été interrompue");
println!("\t Status: {}", error);
break; /* close la socket */
}
Err(error) => {
/* Gestion(s) d'autres erreurs */
println!("[-]Échec de la connexion: Erreur {}", error);
break;
}
}
}
println!("Connection handler exited.");
}
fn main() -> io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:7878")?;
println!("Serveur écoutant sur le port 7878");
for stream_tcp in listener.incoming() {
match stream_tcp {
Ok(stream_tcp) => {
println!("Nouvelle connexion: {}",
stream_tcp.peer_addr()
.expect("[-]Erreur serveur des connexions"));
/*
* Spawner une nouvelle thread
* pour chaque connexion client
*/
thread::spawn(move || {
handle_clients(stream_tcp);
});
}
Err(error) => {
println!("[-]La connexion n'a pas été acceptée: {}",
error);
}
}
}
Ok(())
} |
Partager