C++ boost::asio 详解:从入门到精通网络编程
- [一、C++ boost::asio 详解](#一、C++ boost::asio 详解)
-
- 引言
- [1、 boost::asio 核心概念](#1、 boost::asio 核心概念)
-
- [1.1、 I/O上下文(io_context)](#1.1、 I/O上下文(io_context))
- [1.2 、端点(Endpoint)](#1.2 、端点(Endpoint))
- [1.3、 套接字(Socket)](#1.3、 套接字(Socket))
- 2、同步网络编程
-
- [2.1 、TCP客户端示例](#2.1 、TCP客户端示例)
- [2.2、 TCP服务器示例](#2.2、 TCP服务器示例)
- [3、 异步网络编程](#3、 异步网络编程)
-
- [3.1、 异步TCP服务器](#3.1、 异步TCP服务器)
- [3.2、 异步定时器](#3.2、 异步定时器)
- [4、 高级特性](#4、 高级特性)
-
- [4.1 、协程支持(C++20)](#4.1 、协程支持(C++20))
- [4.2 、SSL/TLS支持](#4.2 、SSL/TLS支持)
- 5、性能优化技巧
-
- [5.1、 使用内存池](#5.1、 使用内存池)
- [5.2、 批量异步操作](#5.2、 批量异步操作)
- 6、常见问题与解决方案
-
- [6.1 、资源管理](#6.1 、资源管理)
- [6.2 、错误处理最佳实践](#6.2 、错误处理最佳实践)
- 二、boost库使用步骤
-
- 1、下载库
- [2、Visual Studio新建工程](#2、Visual Studio新建工程)
- 3、将源码解压到工程目录下
- 4、添加路径
- 三、代码示例

一、C++ boost::asio 详解
引言
在现代软件开发中,网络编程是不可或缺的核心技能。无论是构建高性能服务器、实现分布式系统,还是开发实时通信应用,都需要强大的网络编程库作为支撑。在C++生态中,boost::asio 无疑是网络编程领域的"瑞士军刀",它提供了跨平台、高性能、异步I/O的强大能力。
boost::asio(Asynchronous Input/Output)是Boost库中用于网络和底层I/O编程的核心组件。它基于前摄器模式(Proactor pattern)设计,支持同步和异步操作,能够高效处理大量并发连接。
1、 boost::asio 核心概念
1.1、 I/O上下文(io_context)
io_context 是boost::asio的核心,它代表了程序的I/O执行上下文。所有异步操作都需要通过io_context来调度和执行。
cpp
#include <boost/asio.hpp>
int main() {
// 创建I/O上下文
boost::asio::io_context io_context;
// 运行I/O上下文(同步方式)
io_context.run();
return 0;
}
1.2 、端点(Endpoint)
端点表示网络通信的地址,包括IP地址和端口号。boost::asio支持IPv4和IPv6。
cpp
#include <boost/asio.hpp>
void create_endpoints() {
using boost::asio::ip::tcp;
// 创建IPv4端点
tcp::endpoint ep1(boost::asio::ip::address::from_string("127.0.0.1"), 8080);
// 创建IPv6端点
tcp::endpoint ep2(boost::asio::ip::address_v6::loopback(), 8080);
// 使用域名解析创建端点
boost::asio::io_context io_context;
tcp::resolver resolver(io_context);
tcp::resolver::results_type endpoints = resolver.resolve("www.example.com", "http");
}
1.3、 套接字(Socket)
套接字是网络通信的基础,boost::asio提供了多种类型的套接字:
tcp::socket- TCP套接字udp::socket- UDP套接字ssl::stream<tcp::socket>- SSL/TLS加密套接字
2、同步网络编程
2.1 、TCP客户端示例
cpp
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main() {
try {
boost::asio::io_context io_context;
// 创建TCP套接字
tcp::socket socket(io_context);
// 连接到服务器
tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve("localhost", "8080");
boost::asio::connect(socket, endpoints);
// 发送数据
std::string request = "Hello Server!";
boost::asio::write(socket, boost::asio::buffer(request));
// 接收响应
char reply[1024];
size_t reply_length = boost::asio::read(socket,
boost::asio::buffer(reply, request.size()));
std::cout << "Reply is: ";
std::cout.write(reply, reply_length);
std::cout << "\n";
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
2.2、 TCP服务器示例
cpp
#include <iostream>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main() {
try {
boost::asio::io_context io_context;
// 创建接收器,监听端口8080
tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080));
std::cout << "Server started on port 8080\n";
for (;;) {
// 等待客户端连接
tcp::socket socket(io_context);
acceptor.accept(socket);
std::cout << "Client connected from: "
<< socket.remote_endpoint().address().to_string()
<< "\n";
// 发送欢迎消息
std::string message = "Welcome to boost::asio server!\n";
boost::asio::write(socket, boost::asio::buffer(message));
// 接收客户端消息
char data[1024];
size_t length = socket.read_some(boost::asio::buffer(data));
std::cout << "Received: ";
std::cout.write(data, length);
std::cout << "\n";
}
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
3、 异步网络编程
3.1、 异步TCP服务器
异步编程是boost::asio的强项,能够高效处理大量并发连接。
cpp
#include <iostream>
#include <memory>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class Session : public std::enable_shared_from_this<Session> {
public:
Session(tcp::socket socket) : socket_(std::move(socket)) {}
void start() {
do_read();
}
private:
void do_read() {
auto self(shared_from_this());
socket_.async_read_some(boost::asio::buffer(data_, max_length),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
std::cout << "Received: " << std::string(data_, length) << "\n";
do_write(length);
}
});
}
void do_write(std::size_t length) {
auto self(shared_from_this());
boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
[this, self](boost::system::error_code ec, std::size_t /*length*/) {
if (!ec) {
do_read();
}
});
}
tcp::socket socket_;
enum { max_length = 1024 };
char data_[max_length];
};
class Server {
public:
Server(boost::asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
do_accept();
}
private:
void do_accept() {
acceptor_.async_accept(
[this](boost::system::error_code ec, tcp::socket socket) {
if (!ec) {
std::make_shared<Session>(std::move(socket))->start();
}
do_accept();
});
}
tcp::acceptor acceptor_;
};
int main() {
try {
boost::asio::io_context io_context;
Server server(io_context, 8080);
io_context.run();
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
3.2、 异步定时器
boost::asio的定时器也是异步的,可以与其他异步操作配合使用。
cpp
#include <iostream>
#include <boost/asio.hpp>
void print(const boost::system::error_code& /*e*/,
boost::asio::steady_timer* t, int* count) {
if (*count < 5) {
std::cout << "Timer count: " << *count << "\n";
++(*count);
// 修改定时器过期时间
t->expires_at(t->expiry() + boost::asio::chrono::seconds(1));
// 再次启动异步等待
t->async_wait(std::bind(print,
boost::asio::placeholders::error, t, count));
}
}
int main() {
boost::asio::io_context io_context;
int count = 0;
boost::asio::steady_timer timer(io_context,
boost::asio::chrono::seconds(1));
timer.async_wait(std::bind(print,
boost::asio::placeholders::error, &timer, &count));
io_context.run();
std::cout << "Final count is " << count << "\n";
return 0;
}
4、 高级特性
4.1 、协程支持(C++20)
boost::asio支持C++20协程,让异步代码更加简洁。
cpp
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/experimental/awaitable_operators.hpp>
using boost::asio::experimental::awaitable_operators::operator||;
using boost::asio::ip::tcp;
boost::asio::awaitable<void> echo(tcp::socket socket) {
try {
char data[1024];
for (;;) {
std::size_t n = co_await socket.async_read_some(
boost::asio::buffer(data), boost::asio::use_awaitable);
co_await async_write(socket,
boost::asio::buffer(data, n), boost::asio::use_awaitable);
}
} catch (std::exception& e) {
std::cout << "Echo exception: " << e.what() << "\n";
}
}
boost::asio::awaitable<void> listener() {
auto executor = co_await boost::asio::this_coro::executor;
tcp::acceptor acceptor(executor, {tcp::v4(), 8080});
for (;;) {
tcp::socket socket = co_await acceptor.async_accept(
boost::asio::use_awaitable);
boost::asio::co_spawn(executor,
echo(std::move(socket)), boost::asio::detached);
}
}
int main() {
try {
boost::asio::io_context io_context;
boost::asio::co_spawn(io_context, listener(), boost::asio::detached);
io_context.run();
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
4.2 、SSL/TLS支持
boost::asio支持SSL/TLS加密通信。
cpp
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
namespace ssl = boost::asio::ssl;
using boost::asio::ip::tcp;
int main() {
try {
boost::asio::io_context io_context;
// 创建SSL上下文
ssl::context ctx(ssl::context::tls_client);
ctx.set_default_verify_paths();
// 创建SSL流
ssl::stream<tcp::socket> socket(io_context, ctx);
// 设置服务器名称指示(SNI)
SSL_set_tlsext_host_name(socket.native_handle(), "www.example.com");
// 连接到服务器
tcp::resolver resolver(io_context);
auto endpoints = resolver.resolve("www.example.com", "443");
boost::asio::connect(socket.next_layer(), endpoints);
// SSL握手
socket.handshake(ssl::stream_base::client);
// 发送HTTPS请求
std::string request =
"GET / HTTP/1.1\r\n"
"Host: www.example.com\r\n"
"Connection: close\r\n\r\n";
boost::asio::write(socket, boost::asio::buffer(request));
// 读取响应
boost::asio::streambuf response;
boost::asio::read_until(socket, response, "\r\n");
std::cout << "Response: " << &response << "\n";
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << "\n";
}
return 0;
}
5、性能优化技巧
5.1、 使用内存池
cpp
#include <boost/pool/pool_alloc.hpp>
#include <boost/asio.hpp>
// 使用boost内存池分配socket对象
using SocketAllocator = boost::fast_pool_allocator<
boost::asio::ip::tcp::socket,
boost::default_user_allocator_new_delete,
boost::details::pool::default_mutex,
64, 128>;
class ConnectionManager {
private:
std::list<
std::shared_ptr<boost::asio::ip::tcp::socket>,
SocketAllocator> connections_;
};
5.2、 批量异步操作
cpp
#include <vector>
#include <boost/asio.hpp>
void batch_async_operations() {
boost::asio::io_context io_context;
std::vector<boost::asio::ip::tcp::socket> sockets;
std::vector<boost::asio::streambuf> buffers(10);
// 创建多个socket
for (int i = 0; i < 10; ++i) {
sockets.emplace_back(io_context);
}
// 批量发起异步连接
std::vector<std::future<void>> futures;
for (auto& socket : sockets) {
auto promise = std::make_shared<std::promise<void>>();
futures.push_back(promise->get_future());
socket.async_connect(
boost::asio::ip::tcp::endpoint(
boost::asio::ip::address::from_string("127.0.0.1"),
8080 + &socket - &sockets[0]),
[promise](const boost::system::error_code& ec) {
if (!ec) {
promise->set_value();
} else {
promise->set_exception(
std::make_exception_ptr(
std::runtime_error(ec.message())));
}
});
}
// 等待所有连接完成
io_context.run();
for (auto& future : futures) {
future.wait();
}
}
6、常见问题与解决方案
6.1 、资源管理
cpp
#include <memory>
#include <boost/asio.hpp>
// 使用智能指针管理socket生命周期
class Connection : public std::enable_shared_from_this<Connection> {
public:
static std::shared_ptr<Connection> create(
boost::asio::io_context& io_context) {
return std::shared_ptr<Connection>(
new Connection(io_context));
}
boost::asio::ip::tcp::socket& socket() {
return socket_;
}
void start() {
// 开始异步操作
do_read();
}
private:
Connection(boost::asio::io_context& io_context)
: socket_(io_context) {}
void do_read() {
auto self(shared_from_this());
socket_.async_read_some(
boost::asio::buffer(buffer_),
[this, self](boost::system::error_code ec, std::size_t length) {
if (!ec) {
// 处理数据
do_write(length);
}
// socket析构时自动关闭
});
}
void do_write(std::size_t length) {
auto self(shared_from_this());
boost::asio::async_write(socket_,
boost::asio::buffer(buffer_, length),
[this, self](boost::system::error_code ec, std::size_t /*length*/) {
if (!ec) {
do_read();
}
});
}
boost::asio::ip::tcp::socket socket_;
char buffer_[1024];
};
6.2 、错误处理最佳实践
cpp
#include <iostream>
#include <boost/asio.hpp>
void handle_async_operation() {
boost::asio::io_context io_context;
boost::asio::ip::tcp::socket socket(io_context);
socket.async_connect(
boost::asio::ip::tcp::endpoint(
boost::asio::ip::address::from_string("127.0.0.1"), 8080),
[](const boost::system::error_code& ec) {
if (ec) {
// 分类处理不同错误
if (ec == boost::asio::error::connection_refused) {
std::cerr << "Connection refused\n";
} else if (ec == boost::asio::error::timed_out) {
std::cerr << "Connection timeout\n";
} else if (ec == boost::asio::error::host_not_found) {
std::cerr << "Host not found\n";
} else {
std::cerr << "Connection failed: " << ec.message() << "\n";
}
} else {
std::cout << "Connected successfully\n";
}
});
io_context.run();
}
二、boost库使用步骤
1、下载库


2、Visual Studio新建工程

3、将源码解压到工程目录下
新建一个main.cpp文件

将下载的压缩包解压到main.cpp同级目录,并改名为boost

4、添加路径




三、代码示例
1、测试代码
cpp
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost::asio;
using ip::tcp;
using std::cout;
using std::endl;
using std::string;
// ------------------------------
// 异步 TCP 服务器
// ------------------------------
class Server {
public:
Server(io_context& io, short port)
: acceptor_(io, tcp::endpoint(tcp::v4(), port)) {
start_accept();
}
private:
void start_accept() {
auto sock = std::make_shared<tcp::socket>(acceptor_.get_executor());
acceptor_.async_accept(*sock, [this, sock](const boost::system::error_code& ec) {
if (!ec) {
cout << "\n新客户端连接!" << endl;
this->do_read(sock); // 用 this 调用
}
start_accept();
});
}
void do_read(std::shared_ptr<tcp::socket> sock) {
auto buf = std::make_shared<std::array<char, 1024>>();
sock->async_read_some(buffer(*buf), [this, sock, buf](const boost::system::error_code& ec, size_t len) {
if (!ec) {
cout << "收到:" << string(buf->data(), len) << endl;
this->do_write(sock, buf, len); // 用 this 调用
}
});
}
void do_write(std::shared_ptr<tcp::socket> sock, std::shared_ptr<std::array<char, 1024>> buf, size_t len) {
async_write(*sock, buffer(*buf, len), [this, sock, buf](const boost::system::error_code& ec, size_t) {
if (!ec) {
this->do_read(sock); // 用 this 调用
}
});
}
tcp::acceptor acceptor_;
};
// ------------------------------
// 同步 TCP 客户端
// ------------------------------
void run_client(const string& msg) {
try {
io_context io;
tcp::socket sock(io);
sock.connect(tcp::endpoint(ip::make_address("127.0.0.1"), 8888));
write(sock, buffer(msg));
cout << "客户端发送:" << msg << endl;
char buf[1024] = { 0 };
size_t len = sock.read_some(buffer(buf));
cout << "服务器回复:" << string(buf, len) << endl;
}
catch (std::exception& e) {
cout << "客户端异常:" << e.what() << endl;
}
}
// ------------------------------
// 主函数
// ------------------------------
int main() {
int choice;
cout << "1 - 服务器\n2 - 客户端\n选择:";
std::cin >> choice;
std::cin.ignore();
if (choice == 1) {
cout << "服务器启动,监听 8888 端口..." << endl;
io_context io;
Server srv(io, 8888);
io.run();
}
else if (choice == 2) {
string msg;
cout << "输入消息:";
std::getline(std::cin, msg);
run_client(msg);
}
return 0;
}
2、运行结果

