下面我将详细介绍一下“C++ boost::asio编程-异步TCP详解及实例代码”的完整攻略,包括相关知识点和两个示例说明。
一、boost::asio异步编程基础
1.1 异步和同步
- 同步:调用函数后程序会等待函数返回结果后再执行下一步操作。
- 异步:调用函数后程序不会等待函数返回结果,而是立即执行下一步操作。函数的返回结果则由另一个线程或者回调函数处理并通知调用者。
1.2 boost::asio库
boost::asio是一个跨平台的C++库,用于实现高效的网络编程。它提供了异步I/O操作、网络协议、定时器、序列化和其他常用工具,方便用户在C++中实现高效的网络编程。
在使用boost::asio进行网络编程时,需要掌握以下几个概念:
- io_context:是一个消息队列,用于处理I/O事件和任务。boost::asio的所有异步操作都依赖于io_context对象。
- socket:是一个操作系统提供的基本概念,用于在网络中传输数据。boost::asio中的socket类封装了系统的socket。
- endpoint:定义了socket的网络地址,包括IP地址和端口号。
- buffer:用于存储数据的缓冲区。boost::asio中提供了多种缓冲区类型,例如mutable_buffer和const_buffer。
二、异步TCP编程实例
下面通过两个示例来说明如何使用boost::asio实现异步TCP编程。
2.1 示例一:异步TCP客户端
异步TCP客户端的主要实现步骤如下:
- 创建一个io_context对象。
boost::asio::io_context io_context;
- 创建一个TCP socket并连接服务器端。连接操作是异步的,连接成功或失败都会通过回调函数通知代码。
boost::asio::ip::tcp::socket socket(io_context);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::make_address("127.0.0.1"), 5555);
socket.async_connect(endpoint, [&](const boost::system::error_code& error) {
if (!error) {
std::cout << "Connected to server" << std::endl;
} else {
std::cout << "Connect failed: " << error.message() << std::endl;
}
});
- 向服务器端发送数据。发送数据也是异步的操作,操作结果通过回调函数返回。
std::string message = "Hello, world!";
boost::asio::async_write(socket, boost::asio::buffer(message), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
std::cout << "Sent " << bytes_transferred << " bytes" << std::endl;
} else {
std::cout << "Send failed: " << error.message() << std::endl;
}
});
完整的异步TCP客户端示例代码如下:
#include <iostream>
#include <boost/asio.hpp>
int main() {
boost::asio::io_context io_context;
boost::asio::ip::tcp::socket socket(io_context);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::make_address("127.0.0.1"), 5555);
socket.async_connect(endpoint, [&](const boost::system::error_code& error) {
if (!error) {
std::cout << "Connected to server" << std::endl;
std::string message = "Hello, world!";
boost::asio::async_write(socket, boost::asio::buffer(message), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
std::cout << "Sent " << bytes_transferred << " bytes" << std::endl;
} else {
std::cout << "Send failed: " << error.message() << std::endl;
}
socket.close();
io_context.stop();
});
} else {
std::cout << "Connect failed: " << error.message() << std::endl;
io_context.stop();
}
});
io_context.run();
return 0;
}
2.2 示例二:异步TCP服务器
异步TCP服务器的主要实现步骤如下:
- 创建一个io_context对象和TCP监听器。
boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555));
- 在acceptor上异步等待连接。连接成功或失败都会通过回调函数通知代码。
boost::asio::ip::tcp::socket socket(io_context);
acceptor.async_accept(socket, [&](const boost::system::error_code& error) {
if (!error) {
std::cout << "Accepted new connection" << std::endl;
} else {
std::cout << "Accept failed: " << error.message() << std::endl;
}
});
- 从socket读取数据。socket是异步的,读取操作结果通过回调函数返回。
std::vector<char> buffer(1024);
socket.async_read_some(boost::asio::buffer(buffer), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
std::cout << "Received " << bytes_transferred << " bytes: " << std::string(buffer.data(), bytes_transferred) << std::endl;
} else {
std::cout << "Read failed: " << error.message() << std::endl;
}
socket.close();
io_context.stop();
});
完整的异步TCP服务器示例代码如下:
#include <iostream>
#include <vector>
#include <boost/asio.hpp>
int main() {
boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555));
boost::asio::ip::tcp::socket socket(io_context);
acceptor.async_accept(socket, [&](const boost::system::error_code& error) {
if (!error) {
std::cout << "Accepted new connection" << std::endl;
std::vector<char> buffer(1024);
socket.async_read_some(boost::asio::buffer(buffer), [&](const boost::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
std::cout << "Received " << bytes_transferred << " bytes: " << std::string(buffer.data(), bytes_transferred) << std::endl;
} else {
std::cout << "Read failed: " << error.message() << std::endl;
}
socket.close();
io_context.stop();
});
} else {
std::cout << "Accept failed: " << error.message() << std::endl;
io_context.stop();
}
});
io_context.run();
return 0;
}
以上就是boost::asio异步TCP编程的完整攻略和两个示例说明,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ boost::asio编程-异步TCP详解及实例代码 - Python技术站