面试题答案
一键面试- 初始化
io_context
:io_context
是Boost.Asio的核心对象,负责管理I/O操作。
#include <boost/asio.hpp>
boost::asio::io_context io;
- 创建socket:
使用
ip::tcp::acceptor
来监听新连接,ip::tcp::socket
用于与客户端通信。
boost::asio::ip::tcp::acceptor acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 12345));
boost::asio::ip::tcp::socket socket(io);
- 绑定端口:
在创建
acceptor
时,通过endpoint
指定要绑定的地址和端口。
boost::asio::ip::tcp::acceptor acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 12345));
这里绑定到IPv4的12345端口。
- 监听连接:
使用
acceptor
的listen
方法开始监听。
acceptor.listen();
- 处理新连接:
使用
acceptor
的accept
方法来接受新连接。这一步可以是阻塞或非阻塞的。
acceptor.accept(socket);
以下是一个完整的简单TCP服务器示例:
#include <iostream>
#include <boost/asio.hpp>
void handle_connection(boost::asio::ip::tcp::socket socket) {
try {
char buffer[1024];
size_t length = socket.read_some(boost::asio::buffer(buffer));
std::cout << "Received: ";
std::cout.write(buffer, length);
std::cout << std::endl;
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
}
int main() {
try {
boost::asio::io_context io;
boost::asio::ip::tcp::acceptor acceptor(io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 12345));
acceptor.listen();
while (true) {
boost::asio::ip::tcp::socket socket(io);
acceptor.accept(socket);
std::thread(handle_connection, std::move(socket)).detach();
}
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
在这个示例中:
io_context
初始化程序的I/O操作。acceptor
绑定到12345端口并开始监听。- 在
while (true)
循环中,accept
方法接受新连接,为每个连接创建一个新线程来处理通信(handle_connection
函数)。 handle_connection
函数读取客户端发送的数据并打印到控制台。