gpt4 book ai didi

c++ - 很难理解带有 async_read 和 async_write 的 Boost ASIO TCP 的一些概念

转载 作者:可可西里 更新时间:2023-11-01 02:32:34 25 4
gpt4 key购买 nike

我很难理解在使用 async_read 和 async_write 时构建 tcp 客户端的正确方法。 examples似乎在连接后执行 async_read,然后在处理程序中有 async_write。

在我的客户端和服务器的情况下,当客户端连接时,它需要检查要写入的消息队列,并检查是否需要读取任何内容。我遇到的困难之一是理解这将如何异步工作。

我设想的是在 async_connect 处理程序中,如果 sendQueue 中有任何内容,线程将调用 async_write 并一遍又一遍地调用 async_read。或者它应该在执行 async_read 之前检查是否有任何内容可供读取?下面是我正在谈论的示例。

void BoostTCPConnection::connectHandler()
{
setRunning(true);
while (isRunning())
{
//If send Queue has messages
if ( sendSize > 0)
{
//Calls to async_write
send();
}

boost::shared_ptr<std::vector<char> > sizeBuffer(new std::vector<char>(4));
boost::asio::async_read(socket_, boost::asio::buffer(data, size), boost::bind(&BoostTCPConnection::handleReceive, shared_from_this(), boost::asio::placeholders::error, sizeBuffer));

}
}

void BoostTCPConnection::handleReceive(const boost::system::error_code& error, boost::shared_ptr<std::vector<char> > sizeBuffer)
{

if (error)
{
//Handle Error
return;
}

size_t messageSize(0);
memcpy((void*)(&messageSize),(void*)sizeBuffer.data(),4);

boost::shared_ptr<std::vector<char> > message(new std::vector<char>(messageSize) );

//Will this create a race condition with other reads?
//Should a regular read happen here
boost::asio::async_read(socket_, boost::asio::buffer(data, size),
boost::bind(&BoostTCPConnection::handleReceiveMessage, shared_from_this(),
boost::asio::placeholders::error, message));

}

void BoostTCPConnection::handleReceiveMessage(const boost::system::error_code& error, boost::shared_ptr<std::vector<char> > rcvBuffer)
{
if (error)
{
//Handle Error
return;
}

boost::shared_ptr<std::string> message(new std::string(rcvBuffer.begin(),rcvBuffer.end()));
receivedMsgs_.push_back(message);
}

void BoostTCPConnection::handleWrite(const boost::system::error_code& error,size_t bytes_transferred)
{
//Success
if (error.value() == 0)
return;
//else handleError


}

最佳答案

从概念上讲,async_read 等待数据被接收。在接收到数据并且读取尚未挂起后,只要您希望发生某些事情,就应该随时调用它。同样,async_write 等待数据写入。您应该在需要写入数据且写入尚未挂起时随时调用它。

您应该在完成连接后调用async_read。在您的 async_read 处理程序返回之前,它可能应该再次调用 async_read

当您需要写入连接时,您应该调用 async_write(如果写入尚未挂起)。在您的 async_write 处理程序中,如果您还需要编写更多内容,您应该再次调用 async_write

如果没有读取已挂起,您可以在写入处理程序中调用 async_read,如果您希望在完成写入后继续读取。您也可以只保持读取始终挂起。这取决于你。

在调用 async_read 之前,您不应该检查是否有任何要读取的内容。 async_read 的要点是让它在有内容可读时完成。这是一种等待并同时做其他事情的聪明方法。

关于c++ - 很难理解带有 async_read 和 async_write 的 Boost ASIO TCP 的一些概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314192/

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