簡體   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