Asio C++:高性能网络编程利器(通过示例程序展示多客户端并发、异步通信和定时器组合)

发布于:2025-09-14 ⋅ 阅读:(25) ⋅ 点赞:(0)

1️⃣ Asio C++ Library 是用来做什么的

先说下载地址:https://download.csdn.net/download/2501_91893428/91935928

Asio 是一个跨平台的 C++ 库,核心功能是 提供同步和异步的 I/O 操作,主要用途包括:

  1. 网络编程

    • TCP/UDP 客户端和服务器

    • 异步数据收发、连接管理

  2. 并发和异步任务处理

    • 支持异步操作回调

    • 支持多线程安全 I/O 服务

  3. 定时器和事件驱动系统

    • 提供定时器(steady_timer, deadline_timer

    • 可用于周期任务、延时操作

  4. SSL/TLS 加密通信(通过 asio::ssl

    • 可以轻松实现 HTTPS、加密客户端/服务器

  5. 协程支持

    • C++20 co_await 支持,使异步代码写法更接近同步代码

简单来说,Asio 是一个构建高性能网络应用和事件驱动系统的基础库


2️⃣ 一个 Demo

下面演示一个 异步 TCP 服务器,可以处理多个客户端,并周期性发送消息(使用定时器)。

#include <asio.hpp>
#include <iostream>
#include <memory>
#include <set>

using asio::ip::tcp;

class Session : public std::enable_shared_from_this<Session> {
public:
    Session(tcp::socket socket)
        : socket_(std::move(socket)), timer_(socket_.get_executor()) {}

    void start() {
        do_read();
        start_timer();
    }

private:
    tcp::socket socket_;
    asio::streambuf buffer_;
    asio::steady_timer timer_;

    void do_read() {
        auto self = shared_from_this();
        asio::async_read_until(socket_, buffer_, "\n",
            [this, self](std::error_code ec, std::size_t length) {
                if (!ec) {
                    std::istream is(&buffer_);
                    std::string line;
                    std::getline(is, line);
                    std::cout << "Received: " << line << std::endl;
                    do_read(); // 继续读取
                }
            });
    }

    void start_timer() {
        auto self = shared_from_this();
        timer_.expires_after(std::chrono::seconds(5));
        timer_.async_wait([this, self](std::error_code ec) {
            if (!ec) {
                asio::async_write(socket_,
                    asio::buffer("Ping from server\n"),
                    [this, self](std::error_code write_ec, std::size_t) {
                        if (!write_ec) {
                            start_timer(); // 定时发送下一条消息
                        }
                    });
            }
        });
    }
};

class Server {
public:
    Server(asio::io_context& io_context, short port)
        : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
        do_accept();
    }

private:
    tcp::acceptor acceptor_;

    void do_accept() {
        acceptor_.async_accept(
            [this](std::error_code ec, tcp::socket socket) {
                if (!ec) {
                    std::make_shared<Session>(std::move(socket))->start();
                }
                do_accept(); // 接受下一个客户端
            });
    }
};

int main() {
    try {
        asio::io_context io_context;
        Server server(io_context, 12345);
        io_context.run();
    } catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
    return 0;
}

        


✅ Demo 说明

  1. Server 类:监听 TCP 端口,并异步接受客户端连接。

  2. Session 类:每个客户端对应一个 session,异步读取客户端消息并周期性发送“Ping”消息。

  3. 异步操作

    • async_read_until 读取客户端消息

    • async_write 向客户端发送数据

    • steady_timer 定时触发事件

这个示例展示了 多客户端并发、异步通信和定时器组合,比基础同步示例更接近实际网络应用场景。