ASIO pour C++ : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à la bibliothèque ASIO pour C++

ASIO (Asynchronous Input/Output) est une bibliothèque multiplateforme pour C++ offrant des outils puissants pour les entrées-sorties asynchrones. Elle permet aux développeurs de créer des applications réseau hautes performances gérant sockets, timers, ports série et autres sources d'événements asynchrones. Cette bibliothèque est la base de nombreux projets C++ modernes, notamment Boost.ASIO (partie de Boost) et standalone ASIO (version indépendante).

Pourquoi utiliser ASIO ?

Dans la programmation synchrone traditionnelle, chaque appel bloque le thread jusqu'à la fin de l'opération. C'est inefficace pour les tâches I/O-bound (réseau, fichiers). ASIO résout ce problème en offrant :

  • Asynchronisme : Les opérations sont lancées et exécutées en arrière-plan sans bloquer le thread principal.
  • Scalabilité : Un seul thread peut gérer des milliers de connexions simultanées (modèle Reactor/Proactor).
  • Multiplateforme : Fonctionne sur Windows (IOCP), Linux (epoll), macOS (kqueue) et autres OS.
  • Intégration C++ : Utilise les fonctionnalités modernes de C++11/14/17/20 (lambdas, pointeurs intelligents, coroutines).

Installation d'ASIO

ASIO existe sous deux formes : comme partie de Boost (Boost.ASIO) et comme bibliothèque standalone. Pour la version standalone, l'installation est simple :

Option 1 : Version header-only

Téléchargez la dernière version depuis le site officiel et décompressez-la. Incluez dans votre projet :

#define ASIO_STANDALONE
#include "asio.hpp"

Dans CMakeLists.txt :

add_definitions(-DASIO_STANDALONE)
include_directories(/chemin/vers/asio/include)

Option 2 : Via un gestionnaire de paquets (vcpkg)

vcpkg install asio

Option 3 : Boost.ASIO

#include <boost/asio.hpp>
// Lien : -lboost_system -lpthread (sur Linux)

Important : Pour compiler les exemples, ajoutez le flag -lpthread sur Linux/macOS et liez avec ws2_32.lib sur Windows.

Démarrage rapide : Premier timer asynchrone

Commençons par un exemple classique : un timer asynchrone qui affiche un message après 5 secondes :

#define ASIO_STANDALONE
#include <iostream>
#include "asio.hpp"

int main() {
    asio::io_context io; // Objet gérant les opérations asynchrones

    asio::steady_timer timer(io, asio::chrono::seconds(5));
    
    // Attente asynchrone avec une fonction lambda
    timer.async_wait([&](const asio::error_code& ec) {
        if (!ec) {
            std::cout << "5 secondes se sont écoulées !" << std::endl;
        }
    });

    std::cout << "Lancement du timer..." << std::endl;
    io.run(); // Bloque l'exécution tant qu'il y a des opérations asynchrones
    return 0;
}

Explication :

  • asio::io_context — le cœur de la bibliothèque, gère la file d'attente des événements.
  • asio::steady_timer — un timer fonctionnant en temps monotone.
  • async_wait — lance une attente asynchrone. Quand le timer se déclenche, la fonction passée est appelée.
  • io.run() — démarre la boucle de traitement des événements. Bloque le thread jusqu'à la fin de toutes les opérations.

Méthodes et fonctions principales d'ASIO (10 méthodes)

1. asio::io_context::run()

Rôle : Lance la boucle principale de traitement des événements. Bloque le thread courant en traitant toutes les opérations asynchrones jusqu'à ce que tous les gestionnaires soient exécutés ou que stop() soit appelé.

Paramètres : Aucun.

Retourne : Le nombre de gestionnaires exécutés.

Exemple :

asio::io_context io;
io.post([](){ std::cout << "Bonjour"; });                    

Recommendations