【问题标题】:boost::asio building a buffer with a boost::array containing stringsboost::asio 使用包含字符串的 boost::array 构建缓冲区
【发布时间】:2021-01-31 16:19:01
【问题描述】:

我正在通过遵循文档中的示例并对其进行扩展来学习如何使用 boost::asio。 示例Daytime.4Daytime.5 展示了如何实现同步udp 服务器-客户端通信。该示例通过构造一个 char 类型的 boost 数组然后从该数组构造一个 boost 缓冲区来发送数据:

boost::array<char, 1> send_buf  = {{ 0 }};
socket.send_to(boost::asio::buffer(send_buf), receiver_endpoint);

还有一个例子,他们将一个 std::string 直接传递给缓冲区构造函数:

std::string message = make_daytime_string();
boost::system::error_code ignored_error;
socket.send_to(boost::asio::buffer(message),
remote_endpoint, 0, ignored_error);

到目前为止一切顺利。我现在尝试填充一个字符串数组并将该数组发送到我的 udp 服务器。这总是导致服务器在实际消息前面接收到垃圾字符。 当我像这样构造发送缓冲区时:

std::string message = "I am still here";
boost::array<std::string, 1> send_buf2  = {{ message}};
socket.send_to(boost::asio::buffer(send_buf2), receiver_endpoint);

我得到这样的输出: |��I am still here 当我的数组是这样构造的:

boost::array<std::string, 1> send_buf2  = {{ "I am still here" }};

我的输出中只得到内存垃圾字符。两种情况下的接收长度均为 32(字符)。

服务器读取消息如下:

boost::array<char, 128> recv_buf;
size_t got = socket.receive_from(boost::asio::buffer(recv_buf),
                            remote_endpoint, 0, error);
std::string incoming(recv_buf.begin(), recv_buf.begin() + got);

这只是构造发送缓冲区的坏方法还是有解决此问题的方法?

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    你调用buffer函数的以下重载:

    template<
        typename PodType,
        std::size_t N>
    mutable_buffer buffer(
        boost::array< PodType, N > & data);
    

    仅适用于 POD。 string 不是 POD 类型。

    boost asio 中的缓冲区可以被视为一对:指向数据的指针和数据的长度。在您的情况下,您创建的缓冲区指向字符串的二进制表示,而不是指向由它管理的数据 - std::string 的内部指针指向的字符序列(当使用小字符串优化时,此输出 |��I am still here 是可能的)。这就解释了为什么你得到 32 个字节,它只是 sizeof(std::string) 用于你的库实现。

    如果要发送由 boost::array 管理的数据,可以使用复合缓冲区:

    const boost::array<std::string,2> a{{"I am still here", "xxx"}};
    std::vector<boost::asio::const_buffers_1> v;
    v.push_back(boost::asio::buffer(a[0]));
    v.push_back(boost::asio::buffer(a[1]));
    

    创建缓冲区向量,并将基于std::string创建的缓冲区一一添加到该向量中。

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2016-09-19
      • 1970-01-01
      • 2013-05-27
      • 2015-04-19
      相关资源
      最近更新 更多