1️⃣ Asio C++ Library 是用来做什么的
先说下载地址:https://download.csdn.net/download/2501_91893428/91935928
Asio 是一个跨平台的 C++ 库,核心功能是 提供同步和异步的 I/O 操作,主要用途包括:
网络编程
TCP/UDP 客户端和服务器
异步数据收发、连接管理
并发和异步任务处理
支持异步操作回调
支持多线程安全 I/O 服务
定时器和事件驱动系统
提供定时器(
steady_timer
,deadline_timer
)可用于周期任务、延时操作
SSL/TLS 加密通信(通过
asio::ssl
)可以轻松实现 HTTPS、加密客户端/服务器
协程支持
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 说明
Server 类:监听 TCP 端口,并异步接受客户端连接。
Session 类:每个客户端对应一个 session,异步读取客户端消息并周期性发送“Ping”消息。
异步操作:
async_read_until
读取客户端消息async_write
向客户端发送数据steady_timer
定时触发事件
这个示例展示了 多客户端并发、异步通信和定时器组合,比基础同步示例更接近实际网络应用场景。