面试题答案
一键面试- 建立连接:
- 在同步通信模式下,使用
asio::ip::tcp::socket
对象。首先创建一个io_context
对象,然后构造socket
对象并传入io_context
。接着使用socket
的connect
方法连接到指定的端点。
- 在同步通信模式下,使用
- 发送数据:
- 连接建立后,准备要发送的数据,通常存储在
std::string
或缓冲区中。然后使用socket
的write_some
方法发送数据。
- 连接建立后,准备要发送的数据,通常存储在
关键代码片段示例:
#include <iostream>
#include <asio.hpp>
int main() {
try {
// 创建io_context
asio::io_context io;
// 创建tcp socket
asio::ip::tcp::socket socket(io);
// 解析目标端点
asio::ip::tcp::resolver resolver(io);
asio::ip::tcp::resolver::query query("127.0.0.1", "12345");
asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
// 连接到目标端点
socket.connect(endpoint);
// 准备发送的数据
std::string message = "Hello, Server!";
// 发送数据
asio::write(socket, asio::buffer(message));
std::cout << "Data sent successfully." << std::endl;
} catch (std::exception& e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
在上述代码中:
asio::io_context io;
创建了一个io_context
对象,它负责管理异步操作的执行。asio::ip::tcp::socket socket(io);
创建了一个基于TCP协议的socket
对象,并关联到io_context
。asio::ip::tcp::resolver resolver(io);
创建一个解析器,用于将主机名和端口号解析为网络端点。asio::ip::tcp::resolver::query query("127.0.0.1", "12345");
构造一个查询,指定要连接的主机IP(这里是本地回环地址127.0.0.1
)和端口号12345
。asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
解析查询得到目标端点。socket.connect(endpoint);
使用socket
的connect
方法连接到目标端点。std::string message = "Hello, Server!";
准备要发送的数据。asio::write(socket, asio::buffer(message));
使用asio::write
函数(它内部调用socket
的write_some
方法)将数据发送到连接的套接字。