Cours sur la programmation réseau
Bonjour à tous,
je vous présente un projet que je mène actuellement, à savoir l'écriture d'un cours de programmation réseau, sur l'utilisation de la bibliothèque socket, en C++.
Il s'agit de la version réécrite et améliorée d'un cours que j'ai dispensé aux étudiants de l'ESGI Paris en 2015.
Le but de cette série est de démystifier l'utilisation du réseau et de vous permettre d'en profiter dans vos applications.
Chaque partie présente simplement une composante (connexion, envoi de données…) et vous permet de comprendre son fonctionnement, puis de la mettre en pratique immédiatement, via un TP et des codes sources fournis.
À la fin de cette série, vous serez en possession des briques élémentaires nécessaires à la mise en place d'échanges réseau dans votre programme, sous forme de classes C++ utilisant l'API socket de votre système.
Dans un premier temps, nous apprendrons à appréhender les échanges en TCP, d'abord en tant que simple client, puis comme serveur.
Ensuite nous verrons l'utilisation d'UDP.
L'utilisation de threads et mutex sera également abordée.
Enfin certaines techniques plus spécifiques aux jeux vidéos seront présentées sous forme d'articles, publiés dans la section idoine.
Les articles seront diffusés au fur et à mesure de leur (ré)écriture. Retrouvez-les ci-dessous.
Introduction
:fleche: TCP
- Premiers pas
- Envoi et réception
- Mise en place du protocole
- Premiers pas en tant que serveur
- Envoi et réception depuis le serveur
- Mode non bloquant pour le client
- Quelle architecture de client visée ?
- Un premier serveur : miniserveur
:fleche: UDP
- Premiers pas
- Gérer les pertes et duplications d'identifiants
- S'assurer du bon fonctionnement de son code
- Créer son protocole par-dessus UDP
- Découper et réunifier des paquets & création d'un protocole ordonné non fiable
- Envoi de paquets ordonné fiable
- Combiner tous les protocoles : les canaux de communication
- Gérer des connexions entre machines
- Debugger une application en réseau
:fleche: Jeux
- Un premier jeu : Morpion
:fleche: Divers
- Multi-threading et mutex
- Bases de la sérialisation
- Sérialisation de bits
- Sérialisation avancée
:fleche: Retrouvez tous les cours et tutoriels C++ de Developpez.com
Cours programmation réseau - TCP01 - Premiers pas
Voici la première partie plus concrète.
Commençons par les échanges via protocole TCP, du point de vue du client dans un premier temps.
Au programme : création de socket, connexion à un serveur dont on connait l'IP et passage en revue de quelques fonctions utiles de manière générale.
:fleche: http://bousk.developpez.com/cours/re...-premiers-pas/
:fleche: Retrouvez tous les cours et tutoriels C++ de Developpez.com
Cours programmation réseau - TCP02 - Envoi et réception
Après la mise en bouche assez conséquente, voyons maintenant comment envoyer et recevoir des données via un socket TCP préalablement connecté.
Cette courte partie présente les fonctions send et recv dont nous verrons l'utilisations de manière plus poussée dans la partie suivante qui arrive très bientôt.
:fleche: http://bousk.developpez.com/cours/re...voi-reception/
Cours programmation réseau - TCP03 - Mise en place du protocole
Partons cette fois un peu plus dans les détails du send et du recv, puisqu'il s'agit de mettre en place son protocole, ses règles d'échange de données, en utilisant des paquets TCP.
Il s'agit également de la dernière partie de la première série grâce à laquelle nous savons désormais utiliser TCP en tant que client.
La seconde partie traitera toujours de TCP, mais du point de vue du serveur maintenant.
:fleche: http://bousk.developpez.com/cours/re...ace-protocole/
Cours programmation réseau - TCP04 - Premiers pas en tant que serveur
Salut à tous,
de retour après quelques mois (été, vacances, écriture, boulot, ...)
Il est maintenant temps de passer de l'autre côté et commencer à travailler sur la partie serveur. La partie cliente étant suffisament avancée pour notre utilisation jusque là.
Il s'agit de la partie serveur faisant mirroir à la première partie cliente, donc seuls les concepts de connexion seront présentés : architecture très (et trop) simpliste d'un serveur, comment initialiser un socket pour être utilisé en tant que serveur, comment s'y connecter via l'ip et le port, ainsi que quelques explication pour retrouver les informations du client que l'on reçoit (IP et port).
:fleche: http://bousk.developpez.com/cours/re...-premiers-pas/
Cours programmation réseau - TCP05 - Envoi et réception depuis le serveur
Salut à tous,
il est temps que notre serveur passe la première vitesse et soit capable de réceptionner des données de ses clients et leur en envoyer.
Plusieurs modèles sont présentés et testés : multiplier les threads, l'utilisation de select, poll ou de sockets non bloquants.
:fleche: http://bousk.developpez.com/cours/re...ption-serveur/
Cours programmation réseau - TCP06 - Mode non bloquant pour le client
Salut à tous,
dans la ligne directe de l'article précédent, voici un très court chapitre traitant du mode non bloquant cette fois chez le client.
:fleche: http://bousk.developpez.com/cours/re...-non-bloquant/
Cours programmation réseau - TCP07 - Quelle architecture de client visée ?
Salut à tous,
il s'agit d'un des derniers chapitres à propos du client TCP, dans lequel un client fonctionnel est implémenté en détail.
Retrouvez les propriétés souhaitées pour le client qui justifient cette implémentation, ainsi qu'un exemple d'utilisation dans du code utilisateur.
:fleche: http://bousk.developpez.com/cours/re...ecture-client/
Cours programmation réseau - TCP08 - Un premier serveur : miniserveur
Salut à tous,
Cet article présente la mise en place d'un miniserveur, destiné à tourner en parallèle du jeu, au sein du même exécutable, sur une machine cliente.
La partie la plus importante, et pourtant très simple, est l'évolution du code du chapitre précédent afin de garder une interface claire et connue pour pouvoir écrire et manipuler du code serveur.
:fleche: http://bousk.developpez.com/cours/re...-mini-serveur/
Cours programmation réseau - UDP01 - Introduction et premiers pas
Salut à tous,
changeons un peu d'air afin de nous intéresser à l'utilisation d'UDP.
Ce premier chapitre introduit un peu de vocabulaire, résume les garanties d'UDP et ce qu'on peut attendre en comparaison de TCP et pourquoi il est utilisé.
Ensuite notre premier socket UDP et programme est mis en place avant de finir sur une explication des phénomènes de pertes et duplications inhérents à l'utilisation d'UDP et une première façon de les limiter.
:fleche: http://bousk.developpez.com/cours/re...-premiers-pas/
Cours programmation réseau - UDP02 - Gérer les pertes et duplications d'identifiants
Salut à tous,
avant d'attaquer l'implémentation du protocole en soit, voici un chapitre présentant comment détecter qu'un identifiant est perdu ou dupliqué ainsi que comment gérer sa réinitialisation après avoir atteint la valeur maximale.
:fleche: http://bousk.developpez.com/cours/re...-identifiants/
Cours programmation réseau - UDP03 - S'assurer du bon fonctionnement de son code
Salut à tous,
vue la complexité d'un tel développement, il convient de tester que son code se comporte comme attendu.
Ce très court chapitre introduit donc une solution de tests, unitaires et autres, afin de vous initier à cette pratique.
Ces tests seront étoffés au fur et à mesure des articles et de l'élaborration du moteur réseau.
Je vous présente également le dépôt contenant les sources du moteur créé dans le cadre de l'écriture de ce cours et vous sensibilise à l'utilisation d'un tel outil.
:fleche: http://bousk.developpez.com/cours/re...n-place-tests/
Cours programmation réseau - UDP04 - Créer son protocole par-dessus UDP
Salut à tous,
une année entière s'est écoulée depuis le dernier chapitre 8O
L'écriture n'a pas été arrêtée mais fut très ralentie pendant 2018 par une surcharge professionnelle et personnelle.
2019 sera également chargée mais quelques chapitres devraient voir le jour.
Il est temps d'appréhender la création de son protocol par-dessus UDP.
Ce chapitre est l'approfondissement du chapitre 2 qui introduit la gestion des pertes et duplicatas de datagrammes.
:fleche: https://bousk.developpez.com/cours/r...eer-protocole/
Cours programmation réseau - UDP05 - Découper et réunifier des paquets & protocole ordonné non fiable
Salut à tous,
maintenant que nous avons vu les bases de la création d'un protocole, nous allons enfin itérer sur celle-ci.
Dans ce nouveau chapitre, apprenez comment découper à l'envoi et réunifier à la réception des messages trop gros pour être envoyés par un paquet seul.
Également comment optimiser l'envoi en envoyant plusieurs paquets par datagramme si ceux-ci sont suffisament petits.
Enfin, le chapitre se conclue par la création d'un protocole ordonné non fiable en utilisant UDP.
:fleche: https://bousk.developpez.com/cours/r...ifier-paquets/
Cours programmation réseau - UDP06 - Envoi de paquets ordonné fiable
Salut à tous,
après la création d'un protocole ordonné non fiable, apprenez maintenant à créer un protocole ordonné et fiable.
Ce nouveau chapitre est très similaire au précédent et présentera également une optimisation afin de ne pas perdre le contrôle sur la réception des paquets et la mémoire allouée à cette fin.
:fleche: https://bousk.developpez.com/cours/r...rdonne-fiable/
Cours programmation réseau - UDP07 - Combiner tous les protocoles : les canaux de communication
Salut à tous,
nous avons créé dans les chapitres précédents un protocole ordonné non fiable et un protocole ordonné et fiable, mais seul l'ordonné non fiable était utilisé dans le moteur.
Ce nouveau chapitre présente comment profiter de 2 protocoles ou plus dans votre application via l'introduction de canaux de communication utilisant l'unique socket et connexion dont nous disposons.
:fleche: https://bousk.developpez.com/cours/r...er-protocoles/
Cours de programmation réseau - Bases de la sérialisation
Salut à tous,
nous nous écartons légèrement du réseau à proprement parler pour parler de sérialisation.
Bien qu'essentielle dans l'envoi de données, ces chapitres peuvent également être utilisés indépendamment (système de sauvegarde, ...).
Nous commençons par les bases avec une sérialisation simple.
Bonne lecture !
:fleche: https://bousk.developpez.com/cours/serialisation-bases/
Cours de programmation réseau - Sérialisation de bits
Salut à tous,
après les bases de la sérialisation, passons à la vitesse supérieure et voyons comment optimiser cette sérialisation, en minimisant la taille du tampon nécessaire.
Dans ce chapitre, nous voyons comment sérialiser des valeurs sur des bits et non uniquement sur des octets (une valeur entière sur 7 ou 28 bits par exemple).
Mais aussi comment rendre ceci plus aisé en considérant les valeurs possibles plutôt que le nombre de bits nécessaire à les représenter.
Bonne lecture !
:fleche: https://bousk.developpez.com/cours/serialisation-bits/
Cours de programmation réseau - Sérialisation avancée
Salut à tous,
troisième chapitre dédié à la sérialisation.
Dans celui-ci nous mettons en places un type optimisé pour transférer des entiers sur intervalle, des nombres à virgule fixe pour remplacer les nombres à virgule flottante et des énumérations.
Ce chapitre utilise énormément la métaprogrammation pour y parvenir et nécessite le passage au C++17.
Bonne lecture !
:fleche: https://bousk.developpez.com/cours/s...ation-avancee/
Cours de programmation réseau - UDP08 - Gestion de connexions
Salut à tous,
nous revenons à notre protocole UDP en ajoutant une couche importante pour toute application : la gestion de connexions.
Dans ce chapitre, vous verrez comment mettre en place un système de connexions qui permet de savoir quand une machine essaye de nous joindre, d'accepter ou refuser cette connexion puis de terminer la connexion en notifiant les intéressées à chaque étape.
Un timeout fait également son apparition pour gérer la perte de connexion ou l'absence de réponse à une demande de connexion, afin de ne pas bloquer le moteur et l'application dans un état non souhaité.
Bonne lecture !
:fleche: https://bousk.developpez.com/cours/r...on-connexions/