【问题标题】:boost::asio::async_read_until Don´t truncate the input messageboost::asio::async_read_until 不要截断输入消息
【发布时间】:2020-04-01 15:11:34
【问题描述】:

我试图在程序读取特定字符时截断输入消息,为此我有下一个代码:

这是 ActiveSocketClientConnection.h

class ActiveSocketClientConnection : public boost::enable_shared_from_this<ActiveSocketClientConnection>{
private:

    boost::shared_ptr<tcp::socket> socket_;
    boost::asio::streambuf data_;

    ...

public:

    ...
}

这是 ActiveSocketClientConnection.cpp

void ActiveSocketClientConnection::handleConnect(const boost::system::error_code& error){

    std::string sETX;
    sETX.push_back(0x3A); //0x3A = :

    boost::asio::async_read_until(
        *socket_.get(),
        data_, 
        sETX.c_str(),
        boost::bind(&ActiveSocketClientConnection::handleReadBody,
            this,
            boost::asio::placeholders::error
        )
   );
}

void ActiveSocketClientConnection::handleReadBody(  boost::system::error_code error){
    size_t t = data_.size();

    unsigned char* output = (unsigned char*)malloc(t);
    memcpy(output, boost::asio::buffer_cast<const void*>(data_.data()), t);

    data_.consume(t);

    ...
}

如果我通过套接字连接传递消息(例如)AA:Aasync_read_until 函数将所有消息保存在 data_ 中,不要截断存在字符 : 的消息。

谁能告诉我我做错了什么?

谢谢。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    首先,您有未定义的行为。你用std::string_view 作为分隔符调用async_read_until。但是这个视图是基于 std::string 创建的,它在你的句柄函数中是本地的。 async_read_until 立即结束,作为本地的字符串被销毁,并且您在字符串视图中有悬空指针(std::string_view 不会对字符串进行深度复制,它只是一对:指向数据及其大小的指针)。

    作为解决方案,只需调用过载 char:

    boost::asio::async_read_until(
        *socket_.get(),
        data_, 
        0x3A,  // <- added
        boost::bind(&ActiveSocketClientConnection::handleReadBody,
            this,
            boost::asio::placeholders::error
        )
    

    );


    官方boost reference表示:

    async_read_until 操作成功后,动态缓冲区 序列可能包含超出分隔符的其他数据。一个 应用程序通常会将该数据留在动态缓冲区中 用于检查后续 async_read_until 操作的序列。

    因此,您必须解析数据以寻找第一次出现的分隔符并提取正确的子缓冲区读取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2016-12-22
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多