【发布时间】:2021-01-31 16:19:01
【问题描述】:
我正在通过遵循文档中的示例并对其进行扩展来学习如何使用 boost::asio。 示例Daytime.4 和Daytime.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