2013-04-12 104 views
0

我想使用boost ASIO庫來實現網絡編程。 下面是當一些數據(其與「##」結束時)到達端點這就是所謂的代碼。async_read_until處理程序調用兩次

{ 
    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 ##」,另一次是空字符串。

有人能告訴我是什麼原因,如何解決?

+0

什麼是'm_response'的類型? –

+0

m_response是升壓::支持ASIO ::流緩衝類型。 –

回答

1

你必須清理掉你的m_response緩衝,直到令牌,成功讀取後。

因爲在重新發出異步讀取之前您沒有這樣做,您的響應緩衝區中仍然有##個字符,所以讀取將立即完成。

作爲一個附註,async_read_until調用可能讀取超出##的數據,所以你必須小心只清除和包括##,但不能超過它。

0

我想你只需要m_onReceiveSignal(...)後async_read_until(...)來調用。 更改Handlereceive內部的順序。

這是假設下你第一次調用Handlereceive是從另一個方法(可能連接)通過async_read_untill(...)

相關問題