MST

星途 面试题库

面试题:网络编程之Boost.Asio socket基础

在Boost.Asio中,简述socket对象在同步通信模式下如何建立连接并发送数据?请给出关键代码片段示例。
46.8万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试
  1. 建立连接
    • 在同步通信模式下,使用asio::ip::tcp::socket对象。首先创建一个io_context对象,然后构造socket对象并传入io_context。接着使用socketconnect方法连接到指定的端点。
  2. 发送数据
    • 连接建立后,准备要发送的数据,通常存储在std::string或缓冲区中。然后使用socketwrite_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);使用socketconnect方法连接到目标端点。
  • std::string message = "Hello, Server!";准备要发送的数据。
  • asio::write(socket, asio::buffer(message));使用asio::write函数(它内部调用socketwrite_some方法)将数据发送到连接的套接字。