繁体   English   中英

难以理解带有async_read和async_write的Boost ASIO TCP的一些概念

[英]Having a hard time understanding a few concepts with Boost ASIO TCP with async_read and async_write

我很难理解使用async_read和async_write时应该构造tcp客户端的正确方法。 这些示例似乎在连接后执行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是在需要读取内容时完成它。 这是同时等待和执行其他操作的明智方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM