【问题标题】:boost::asio::udp async response is not entirely receivedboost::asio::udp 异步响应未完全收到
【发布时间】:2018-06-29 15:26:30
【问题描述】:

说明

我的程序向服务器发送一个 udp 数据报。使用 wireshark,我看到了来自服务器的查询和响应(79 字节)。

发送功能

void Query::start_send(const std::string data, const QueryType queryType) {
    boost::shared_ptr<std::string> message(new std::string(data));
    socket.async_send_to(boost::asio::buffer(*message), endPoint,
        boost::bind(&Query::handler_send, this, message,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
    this->queryType = queryType;
}

启动接收功能

void Query::start_receive() {
    socket.async_receive_from(
        boost::asio::buffer(receiveBuffer, receiveBuffer.max_size()), endPoint,
        boost::bind(&Query::handler_receive, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
}

接收处理程序

void Query::handler_receive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    if (!error || error == boost::asio::error::message_size) {
        std::cout << "Bytes transferred " << bytes_transferred << std::endl << strlen((char*)this->receiveBuffer.data()) << std::endl;
    }
    else {
        std::cout << "Receive failed" << std::endl << error.value() << std::endl << error.message() << std::endl;
    }
}

控制台输出

Bytes transferred 79
11

bytes_transferred 值是正确的,但我的响应缓冲区(字符向量)“receiveBuffer”只包含 11 个字节而不是 79 个字节。

Wireshark

发送中

响应

【问题讨论】:

  • 您发送的数据似乎包含任意二进制数据,而不是字符串。您似乎忘记了 C++ 中的 char 字符串实际上称为 null-terminated 字节字符串。 null-terminator 是一个值为0 的字节。您不应该对任意二进制数据使用字符串函数。
  • 一个字节是一个字节是一个字节...仅仅因为一些数据是字符串,或者至少可以用作字符串,并不意味着全部 data 是一个长字符串,可以打印或以其他方式传递给字符串函数。您需要知道您收到的消息的实际协议和结构,否则它不会真正明智。
  • 谢谢我已经用一个无符号字符向量修改了我的字符向量,它是有效的。

标签: c++ udp boost-asio packet datagram


【解决方案1】:

您的问题与strlen((char*)this-&gt;receiveBuffer.data())有关。

strlen 接受一个以 nul 结尾的 C 字符串作为输入。所以它在遇到字节00时停止计数。

您似乎收到了混合的二进制/文本数据。您不能简单地将其打印为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多