[英]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.