- Types de données :
i32,u32,f32,String, etc. - Conventions : noms en
snake_case, pas de tirets ni de chiffres au début. - Variables :
let, typage explicite (let age: u32 = 30) ou implicite.
-
Déclaration avec
fn -
Paramètres typés, valeurs de retour (
-> i32) -
Appels depuis
main() -
Exemples :
fn addition(n1: i32, n2: i32) -> i32 { ... }fn say_hello(nom: &str)
-
Définition de types personnalisés comme
Salarie,Personne,CompteBancaire -
Implémentation de méthodes avec
impl -
Types d’accès :
&self→ lecture&mut self→ modificationself→ consommation (l’objet n’est plus utilisable ensuite)
-
Attributs :
nometsolde -
Méthodes :
afficher()deposer(montant)retirer(montant)fermer()→ consomme l’objet
-
Points bonus proposés :
- Interdire dépôt négatif
- Renommer un compte (nouvelle instance)
- Gérer plusieurs comptes via
Vec<CompteBancaire>
-
ifpour tester parité, bornes, etc. -
Boucles :
for i in 1..=10loop { ... break; }while compteur < 5
-
Itérations avec index via
.enumerate() -
Utilisation de
.iter()pour itérer sans consommer les éléments
-
Tableaux statiques
[i32; 4] -
Vecteurs dynamiques
vec![...] -
Exemples :
for &elt in &tab: itération sans transfert de propriété- Affichage de menus dynamiques avec
Vecetenumerate()
- Similaire à
switchen C/Java, mais plus puissant - Exemple :
match nombre {
1 => println!("Un"),
2 => println!("Deux"),
_ => println!("Autre")
}Les notions suivantes ont été abordées :
Structures (struct) : encapsulation des propriétés d’un fichier dans une structure Fichier.
Implémentation de méthodes (impl) : toutes les opérations (créer, lire, écrire...) sont définies dans un bloc impl lié à la structure.
Gestion de l'ownership et du borrowing : passage de &self dans les méthodes pour respecter le modèle d’ownership de Rust.
Utilisation de match, loop, while : menu principal interactif basé sur des structures de contrôle.
Gestion des fichiers avec std::fs et OpenOptions.
Utilisation de la bibliothèque chrono : ajout de la date/heure aux opérations pour le suivi.
Manipulation de chemins de fichiers : via std::path::Path pour vérifier l'existence.
Gestion des erreurs (Result, match) : traitement propre des erreurs lors des lectures/écritures.
Fonctions asynchrones (async fn) et await : exécution non bloquante de tâches. Macro #[tokio::main] : transforme main() en fonction asynchrone avec le runtime Tokio. Gestion des connexions TCP : TcpListener::bind, TcpStream, accept().await. Lecture asynchrone ligne par ligne : via tokio::io::BufReader et .lines().await. Partage de ressources entre tâches : Arc pour le comptage de références partagé. Accès concurrent sécurisé : tokio::sync::Mutex pour protéger le fichier partagé. Création de tâches concurrentes : tokio::spawn(async move { ... }). Formatage d’horodatage : chrono::Utc::now().to_rfc3339().
Implémentation d'un client DNS qui envoie des requêtes pour résoudre un nom de domaine, et un serveur DNS simplifié qui répond avec une adresse IP codée en dur.
- Envoi/réception de paquets DNS via UDP avec
tokio::net::UdpSocket - Extraction du nom de domaine à partir du buffer binaire (RFC 1035)
- Construction manuelle d'une réponse DNS binaire avec entête et réponse IP
on lance server_dns_tp7.rs avec la commande cargo run --bin server_dns_tp7
puis client_dns_tp7.rs avec la commande cargo run --bin client_dns_tp7
j'ai choisi de créer un protocole de messagerie au-dessus de TCP, avec un format JSON personnalisé contenant un expéditeur, un contenu et un horodatage.
- Communication via
tokio::net::TcpStreametTcpListener - Structure
Messagesérialisée avecserde_json - Gestion de plusieurs clients en tâches parallèles (serveur non bloquant)
- Client interactif en ligne de commande avec pseudo
on lance server_chat_tp8.rs avec la commande cargo run --bin server_chat_tp8
puis client_chat_tp8.rs avec la commande cargo run --bin client_chat_tp8
Utilisation d'un serveur et d'un client WebSocket pour des communications full-duplex en temps réel, inspirées des chats modernes.
- Serveur WebSocket avec
tokio-tungstenite - Client WebSocket qui lit les entrées utilisateur et reçoit les messages du serveur
- Splitting des flux (
read/write) pour paralléliser l'envoi et la réception
on lance server_ws_tp9.rs avec la commande cargo run --bin server_ws_tp9
puis client_ws_tp9.rs avec la commande cargo run --bin client_ws_tp9





