gpt4 book ai didi

c++ - async_read_until 处理程序调用了两次

转载 作者:行者123 更新时间:2023-11-28 07:40:16 24 4
gpt4 key购买 nike

我正在尝试使用 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##”,另一次使用空字符串。

谁能告诉我是什么原因以及如何解决它?

最佳答案

在成功读取后,您需要清除您的 m_response 缓冲区,直到 token 。

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

作为旁注,async_read_until 调用可能读取## 之外的数据,因此您必须小心,只清除 ## 之前并包括 ##,但还没有过去。

关于c++ - async_read_until 处理程序调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com