🔝 Retour au Sommaire
La programmation réseau est un domaine essentiel du développement logiciel moderne. Pratiquement toutes les applications professionnelles ont besoin de communiquer sur un réseau : applications web, APIs REST, services cloud, jeux multijoueurs, applications IoT, systèmes distribués, etc.
FreePascal et Lazarus offrent des outils puissants et flexibles pour développer des applications réseau robustes et performantes, que ce soit sur Windows, Linux, macOS ou d'autres plateformes.
La programmation réseau permet de créer :
- Applications client-serveur : Chat, messagerie instantanée, systèmes de gestion
- Services web et APIs REST : Microservices, backends d'applications mobiles
- Applications distribuées : Calcul distribué, bases de données réparties
- Jeux multijoueurs : Communication temps réel entre joueurs
- IoT et domotique : Capteurs, actionneurs, systèmes de surveillance
- Systèmes de fichiers distribués : Partage et synchronisation de fichiers
- Applications de monitoring : Surveillance de serveurs, collecte de métriques
- Outils d'administration réseau : Scan de ports, diagnostic réseau
- ✅ Multi-plateforme : Le même code fonctionne sur Windows et Linux
- ✅ Performance : Code natif compilé, pas d'interpréteur
- ✅ Bibliothèques riches : Synapse, Indy, sockets natifs
- ✅ Stabilité : Gestion robuste de la mémoire
- ✅ Portabilité : Du Raspberry Pi aux serveurs d'entreprise
- ✅ Facilité : Syntaxe claire, composants visuels disponibles
Pour comprendre la programmation réseau, il est important de connaître les couches du réseau :
┌─────────────────────────────────────────────────┐
│ 7. Application │ HTTP, FTP, SMTP, DNS │ ← Nous programmons ici
├─────────────────────────────────────────────────┤
│ 6. Présentation │ SSL/TLS, Encodage │
├─────────────────────────────────────────────────┤
│ 5. Session │ Gestion des connexions │
├─────────────────────────────────────────────────┤
│ 4. Transport │ TCP, UDP │ ← Et parfois ici
├─────────────────────────────────────────────────┤
│ 3. Réseau │ IP, ICMP, Routage │
├─────────────────────────────────────────────────┤
│ 2. Liaison │ Ethernet, WiFi │
├─────────────────────────────────────────────────┤
│ 1. Physique │ Câbles, ondes radio │
└─────────────────────────────────────────────────┘
En tant que développeurs, nous travaillons principalement aux couches 4 (Transport) et 7 (Application).
Le modèle le plus courant en programmation réseau :
Client Serveur
│ │
│────── 1. Connexion ───────────>│
│ │
│<───── 2. Acceptation ──────────│
│ │
│────── 3. Requête ─────────────>│
│ │
│ [Traitement]
│ │
│<───── 4. Réponse ──────────────│
│ │
│────── 5. Fermeture ───────────>│
│ │
Caractéristiques :
- Le serveur attend passivement les connexions
- Le client initie activement la communication
- Peut être 1-à-1 (un client, un serveur) ou N-à-1 (plusieurs clients, un serveur)
Analogie : Comme un appel téléphonique
Caractéristiques :
├─ Orienté connexion (handshake)
├─ Fiable (garantie de livraison)
├─ Ordre préservé
├─ Contrôle de flux
├─ Contrôle d'erreur
└─ Plus lent qu'UDP
Utilisation :
- Navigation web (HTTP/HTTPS)
- Emails (SMTP, POP3, IMAP)
- Transfert de fichiers (FTP)
- SSH, Telnet
- Bases de données
Exemple de connexion TCP :
Client Serveur
│ │
│─── SYN ───────>│ (Demande de connexion)
│<── SYN+ACK ────│ (Acceptation)
│─── ACK ───────>│ (Confirmation)
│ │
[Connexion établie]
Analogie : Comme envoyer une lettre par la poste
Caractéristiques :
├─ Sans connexion
├─ Non fiable (pas de garantie)
├─ Pas d'ordre garanti
├─ Pas de contrôle de flux
├─ Très rapide
└─ Léger (peu d'overhead)
Utilisation :
- Streaming audio/vidéo
- Jeux en ligne
- DNS (requêtes DNS)
- VoIP (téléphonie IP)
- Broadcast/Multicast
Exemple UDP :
Client Serveur
│ │
│─── Paquet 1 ──>│
│─── Paquet 2 ──>│
│─── Paquet 3 ──>│
│ │
(Envoi direct, pas de connexion)
Une adresse IP identifie un appareil sur le réseau :
IPv4 (la plus courante) :
192.168.1.100
│ │ │ │
└───┴───┴──┴─── 4 octets (32 bits)
Exemples :
- 127.0.0.1 → localhost (boucle locale)
- 192.168.x.x → Réseaux privés
- 10.x.x.x → Réseaux privés
- 0.0.0.0 → Toutes les interfaces
IPv6 (nouvelle génération) :
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Exemples :
- ::1 → localhost
- fe80:: → Link-local
Un port identifie une application sur un appareil :
Numéro de port : 0 à 65535
├─ 0 à 1023 → Ports bien connus (nécessitent privilèges)
│ ├─ 20, 21 → FTP
│ ├─ 22 → SSH
│ ├─ 25 → SMTP (email sortant)
│ ├─ 53 → DNS
│ ├─ 80 → HTTP
│ ├─ 110 → POP3 (email entrant)
│ ├─ 143 → IMAP
│ └─ 443 → HTTPS
│
├─ 1024 à 49151 → Ports enregistrés
│ ├─ 3000 → Node.js (convention)
│ ├─ 3306 → MySQL
│ ├─ 5432 → PostgreSQL
│ ├─ 6379 → Redis
│ └─ 8080 → HTTP alternatif
│
└─ 49152 à 65535 → Ports dynamiques/privés
Exemple complet :
http://192.168.1.100:8080/api/users
│ │ │ │
│ │ │ └── Chemin (application)
│ │ └─────── Port
│ └────────────────────── Adresse IP
└───────────────────────────── Protocole
Un socket est le point de terminaison d'une communication réseau. C'est l'équivalent d'une "prise" qui permet de se brancher sur le réseau.
Application
│
▼
Socket ←─── Interface de programmation
│
▼
Protocole (TCP/UDP)
│
▼
Réseau
Types de sockets :
- SOCK_STREAM : Sockets TCP (flux continu)
- SOCK_DGRAM : Sockets UDP (datagrammes)
- SOCK_RAW : Sockets bruts (accès bas niveau)
FreePascal offre plusieurs options pour la programmation réseau, du niveau le plus bas au plus haut :
uses
Sockets; // Accès direct aux sockets systèmeAvantages :
- ✅ Contrôle total
- ✅ Performance maximale
- ✅ Pas de dépendances
Inconvénients :
- ❌ Plus complexe
- ❌ Gestion manuelle des erreurs
- ❌ Code plus verbeux
Quand l'utiliser :
- Protocoles personnalisés
- Optimisations extrêmes
- Apprentissage en profondeur
uses
blcksock, httpsend, smtpsend;Avantages :
- ✅ Simple à utiliser
- ✅ Léger et portable
- ✅ Bien documenté
- ✅ Support de nombreux protocoles
Inconvénients :
- ❌ Pas de composants visuels
- ❌ API procédurale
Quand l'utiliser :
- Applications console
- Services en arrière-plan
- Scripts et outils
uses
IdHTTP, IdTCPServer, IdSMTP;Avantages :
- ✅ Composants visuels
- ✅ Orienté objet
- ✅ Riche en fonctionnalités
- ✅ Événements et threads intégrés
Inconvénients :
- ❌ Plus lourd
- ❌ Courbe d'apprentissage
Quand l'utiliser :
- Applications graphiques
- Développement rapide
- Serveurs complexes
| Critère | Sockets natifs | Synapse | Indy |
|---|---|---|---|
| Complexité | Élevée | Moyenne | Faible |
| Contrôle | Total | Bon | Moyen |
| Performance | Maximale | Excellente | Bonne |
| Facilité | Difficile | Facile | Très facile |
| GUI | ❌ | ❌ | ✅ |
| Poids | Minimal | Léger | Lourd |
| Courbe d'apprentissage | Raide | Douce | Très douce |
Le pattern le plus basique :
Client ─────> Serveur
- Un client se connecte
- Le serveur traite la requête
- La connexion se ferme
Usage : Requêtes HTTP simples, scripts
Client 1 ──┐
├──> Serveur (traite un à la fois)
Client 2 ──┘
- Le serveur traite les clients un par un
- Les autres attendent dans une queue
Usage : Serveurs peu sollicités
Client 1 ──> Thread 1 ─┐
├──> Serveur
Client 2 ──> Thread 2 ─┘
- Un thread par client
- Traitement parallèle
Usage : Serveurs moyennement sollicités
Client 1 ──┐ ┌─ Worker 1
│ │
Client 2 ──┼─> Queue ───┼─ Worker 2
│ │
Client 3 ──┘ └─ Worker 3
- Nombre fixe de workers
- Réutilisation des threads
Usage : Serveurs très sollicités
Client 1 ─┐
├─> Event Loop ─> Callbacks
Client 2 ─┘
- Un seul thread
- Multiplexage I/O
Usage : Serveurs haute performance (Node.js style)
Le protocole du web :
GET /api/users HTTP/1.1
Host: example.com
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{"users": [...]}Caractéristiques :
- Sans état (stateless)
- Requête/réponse
- Texte (lisible)
- Port 80 (HTTP) ou 443 (HTTPS)
Transfert de fichiers :
Control Connection (port 21) : Commandes
Data Connection (port 20) : Transfert
Emails :
- SMTP (port 25, 587) : Envoi
- POP3 (port 110) : Réception (téléchargement)
- IMAP (port 143) : Réception (synchronisation)
Résolution de noms :
example.com ──[DNS]──> 93.184.216.34
Communication bidirectionnelle en temps réel :
Client <══════════> Serveur
(connexion persistante)
Chiffrement des communications :
HTTP + SSL/TLS = HTTPS
SMTP + SSL/TLS = SMTPS
FTP + SSL/TLS = FTPS
Concepts clés :
- Chiffrement des données
- Authentification du serveur
- Intégrité des messages
- Certificats X.509
-
Toujours valider les entrées
if Length(Input) > MAX_SIZE then raise Exception.Create('Input too large');
-
Utiliser SSL/TLS pour les données sensibles
HTTP.IOHandler := SSLHandler;
-
Ne jamais stocker de mots de passe en clair
HashedPassword := HashPassword(Password);
-
Implémenter des timeouts
Socket.ReceiveTimeout := 30000; // 30 secondes
-
Filtrer les adresses IP si nécessaire
if not IsAllowedIP(ClientIP) then Disconnect;
1. Wireshark
- Capture et analyse de paquets
- Visualisation du trafic réseau
- Décodage de protocoles
2. tcpdump (Linux)
sudo tcpdump -i eth0 port 80803. netstat / ss
# Voir les connexions actives
netstat -an | grep 8080
ss -an | grep 80804. telnet / nc (netcat)
# Tester une connexion TCP
telnet localhost 8080
nc -v localhost 80805. curl
# Tester une API HTTP
curl -v http://localhost:8080/api/users| Problème | Cause probable | Solution |
|---|---|---|
| Connexion refusée | Serveur non démarré ou firewall | Vérifier le serveur et le firewall |
| Timeout | Réseau lent ou serveur bloqué | Augmenter le timeout, vérifier le serveur |
| Broken pipe | Client déconnecté | Gérer l'exception |
| Address in use | Port déjà utilisé | Changer de port ou arrêter l'autre process |
| Permission denied | Port < 1024 sans privilèges | Utiliser sudo ou port > 1024 |
-
Utiliser des buffers appropriés
const BUFFER_SIZE = 8192; // 8 KB
-
Réutiliser les connexions (Keep-Alive)
Connection: keep-alive -
Compresser les données
Content-Encoding: gzip -
Paralléliser avec des threads
ThreadPool.AddTask(ClientSocket);
-
Utiliser des protocoles binaires pour la performance
- Moins verbeux que le texte
- Plus rapide à parser
- Latence : Temps de réponse
- Débit : Quantité de données transférées
- Connexions simultanées : Charge du serveur
- Taux d'erreur : Fiabilité
- Utilisation CPU/Mémoire : Efficacité
Windows :
{$IFDEF WINDOWS}
LibSSL = 'ssleay32.dll';
LibCrypto = 'libeay32.dll';
{$ENDIF}Linux :
{$IFDEF UNIX}
LibSSL = 'libssl.so.1.1';
LibCrypto = 'libcrypto.so.1.1';
{$ENDIF}Windows : Pas de restriction sur les ports
Linux : Ports < 1024 nécessitent root
sudo ./myserver
# ou
sudo setcap 'cap_net_bind_service=+ep' ./myserverWindows :
netsh advfirewall firewall add rule name="MyApp" dir=in action=allow protocol=TCP localport=8080Linux :
sudo ufw allow 8080/tcp
sudo firewall-cmd --add-port=8080/tcp --permanentCe chapitre couvre tous les aspects de la programmation réseau avec FreePascal/Lazarus :
10.1 : Synapse - Bibliothèque légère et efficace
10.2 : Indy - Framework complet avec composants visuels
10.3 : Protocoles TCP/UDP bas niveau - Contrôle total
10.4 : Serveurs HTTP/HTTPS personnalisés - Web backends
10.5 : Configuration SSL/TLS - Sécurité des communications
10.6 : Clients et serveurs WebSocket - Temps réel
10.7 : Protocoles binaires personnalisés - Performance maximale
10.8 : RPC et IPC - Communication inter-processus
10.9 : mORMot - Framework SOA/REST haute performance
10.10 : gRPC et Protocol Buffers - APIs modernes
10.11 : P2P et protocoles décentralisés - Systèmes distribués
10.12 : Configuration réseau et firewall - Déploiement
Avant de commencer ce chapitre, vous devriez être à l'aise avec :
- ✅ Programmation orientée objet en Pascal
- ✅ Gestion des exceptions
- ✅ Threads et multithreading (bases)
- ✅ Manipulation de fichiers et flux (streams)
- ✅ Notions de base sur les réseaux (IP, ports)
- FreePascal Sockets : https://www.freepascal.org/docs-html/rtl/sockets/
- Synapse : http://www.ararat.cz/synapse/
- Indy : http://www.indyproject.org/
- RFC 793 : TCP
- RFC 768 : UDP
- RFC 2616 : HTTP/1.1
- RFC 7540 : HTTP/2
- RFC 6455 : WebSocket
- UNIX Network Programming - W. Richard Stevens
- TCP/IP Illustrated - W. Richard Stevens
- Beej's Guide to Network Programming
Tous les exemples sont testés sur :
- ✅ Windows 10/11
- ✅ Ubuntu 20.04/22.04 LTS
- ✅ FreePascal 3.2.2+
- ✅ Lazarus 2.2.0+
// Commentaire explicatif
WriteLn('Sortie console'); // Commentaire en ligne
{ Bloc de commentaire
pour plusieurs lignes }- 💡 Conseil : Astuce pratique
⚠️ Attention : Point important- 🔒 Sécurité : Aspect sécurité
- 🚀 Performance : Optimisation
- 🐛 Débogage : Aide au débogage
- 📝 Note : Information complémentaire
Maintenant que vous avez une vue d'ensemble de la programmation réseau avec FreePascal, plongeons dans les détails avec les bibliothèques et techniques spécifiques !