0

我正在尝试使用 boost asio 库来实现网络编程。这是一些数据(以“##”结尾)到达端点时调用的代码。

{
    boost::asio::async_read_until(m_socket, m_response,
                std::string("##"),
                boost::bind(&CTcpClient::HandleReceive,
                                shared_from_this(),
                                boost::asio::placeholders::error,
                                boost::asio::placeholders::bytes_transferred));

}


void CTcpClient::HandleReceive(const ErrorCodeType p_errorCode, size_t p_length)
{
    IN_FUNCTION

    if ( !p_errorCode )
    {
        logInfo(STR("Data received ..."));

        boost::asio::async_read_until(m_socket, m_response,
            std::string("##"),
            boost::bind(&CTcpClient::HandleReceive,
                            shared_from_this(),
                            boost::asio::placeholders::error,
                            boost::asio::placeholders::bytes_transferred));

        m_onReceiveSignal(sbuf2s(m_response));

    }
    else
    {
        Shutdown(p_errorCode);
    }

    OUT_FUNCTION
}

假设发送到端点的数据是“KINGS##”。因此,Handlereceive 应该被调用一次。但在我的代码中,这被调用了两次,一次是“KINGS##”,另一次是空字符串。

有人能告诉我是什么原因以及如何解决吗?

4

2 回答 2

1

成功读取后,您需要清除m_response缓冲区,直到令牌。

因为您在重新发出异步读取之前没有这样做,所以您的响应缓冲区中仍然有##字符,因此读取将立即完成。

附带说明一下,async_read_until调用可能会读取 ## 之外的数据,因此您必须小心仅清除并包括 ##,但不能超过它。

于 2013-04-12T19:11:21.483 回答
0

我认为您只需要在 m_onReceiveSignal(...) 之后调用 async_read_until(...)。在 Handlereceive 中更改两者的顺序。

这是假设您第一次调用 Handlereceive 是通过 async_read_untill(...) 从另一个方法(可能是连接)

于 2017-11-13T22:54:46.710 回答