2011-12-09 123 views
2

我有一個本地posix套接字,我試圖從使用boost :: asio異步讀取: :async_read。但是當我這樣做時:使用boost :: asio :: async_read失敗,但boost :: asio :: read工程(正在使用io_stream.run_one())

// io_stream and fd are passed by reference to this function 
asio::posix::stream_descriptor stream(io_stream); 
stream.assign(fd); 

boost::system::error_code ec; 

asio::async_read(stream, buffer, 
       asio::transfer_at_least(1), 
       boost::bind(doRead, 
          asio::placeholders::error, 
          asio::placeholders::bytes_transferred)); 
size_t count = io_service.run_one(ec); 

計數變量設置爲0並且doRead處理程序從不調用,ec不包含錯誤。但是,如果我有一個同步讀取代異步讀取:

size_t count = asio::read(stream, buffer, 
          asio::transfer_at_least(1)); 

這工作,我得到的數據的預期量回到計數變量。我使用由「int pipe(int pipefd [2]);」創建的fd的測試用例和傳遞數據通過做工精細與ASIO :: async_read所以我想它可能是幾個選項:

  • 一些我傳遞本地描述符是如何以某種方式不兼容async_read所以它是默默地失敗。我試圖通過阻斷和關閉來創建它,但無濟於事。
  • io_service和posix :: stream_descriptor是一些如何不連接,所以io_service從不嘗試運行讀取。這可能是由於我通過引用傳遞io_service嗎? (並在一些線程以及這一問題?)
+0

'stream_descriptor'可以很好地處理'pipe'的讀端的描述符,參見[this](http://stackoverflow.com/questions/5210796/boost-asio-how-to-write- console-server/5211349)#5211349)回答。我懷疑你的第二顆子彈是你看到的行爲的原因。請編輯您的問題,並附上一個[簡短,自包含,正確的示例](http://sscce.org/)供我們分析。 –

+0

週一上班時我會一起上班,因爲我家裏沒有代碼,謝謝! –

回答

1

我發現這個問題。

我在擁有對象的初始化函數中調用io_service.stop(),因爲它可以重新初始化。在調用停止之後,我並沒有調用io_service.reset(),而是在停止之後io_service不會運行,直到調用reset爲止。

RTFM中的一節課就是停止並重置文檔。

但是boost :: system :: error_code變量沒有反映這個狀態,這有點令人沮喪,因爲它可以節省我的時間。

相關問題