簡體   English   中英

boost :: asio async_read不接收數據或不使用回調

[英]boost::asio async_read doesn't receive data or doesn't use callback

我正在嘗試使用boost asio的async_read()免費函數從服務器應用程序接收數據,但是我從未設置為接收時設置的回調。

客戶端代碼是這樣的:

Client::Client()
{
  m_oIoService.run(); // member boost::asio::io_service
  m_pSocket = new boost::asio::ip::tcp::socket(m_oIoService);

  // Connection to the server
  [...]

  // First read
  boost::asio::async_read(*m_pSocket,
                          boost::asio::buffer((void*)&m_oData, sizeof(m_oData)),
                          boost::bind(&Client::handleReceivedData, this,
                                      boost::asio::placeholders::error,
                                      boost::asio::placeholders::bytes_transferred));
}

我嘗試使用小數據(短字符串),但無法正常工作。 當我使用兩個相同的第一個參數使用同步讀取功能( boost::asio::read() )時,一切工作正常。

使用io_service是否會丟失某些內容? 我仍然不確定它是如何工作的。

boost::asio::service::run ()是阻塞調用。 現在,在您的示例中,它可能會立即返回,也可能不會立即返回。 如果沒有,您甚至會在創建套接字之前就被阻塞,並且從不調用read,因此不能期望回調。 否則,將退出調度循環,因此不會傳遞任何回調。

閱讀有關boost::asio::service::run () 我建議您查看文檔,包括教程,示例和參考。 值得深入了解它的概念。

希望能幫助到你!

PS:順便說一句,您的代碼不是異常安全的。 注意,如果類的構造函數因異常而失敗,則永遠不會調用該類實例的析構函數。 因此,如果m_pSocket的類型不是“智能指針”之一,則可能會泄漏至少。 您應該考慮使其異常安全,將代碼移至用戶應調用的另一種方法,甚至將此功能與自由函數包裝在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM