我有一個本地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嗎? (並在一些線程以及這一問題?)
'stream_descriptor'可以很好地處理'pipe'的讀端的描述符,參見[this](http://stackoverflow.com/questions/5210796/boost-asio-how-to-write- console-server/5211349)#5211349)回答。我懷疑你的第二顆子彈是你看到的行爲的原因。請編輯您的問題,並附上一個[簡短,自包含,正確的示例](http://sscce.org/)供我們分析。 –
週一上班時我會一起上班,因爲我家裏沒有代碼,謝謝! –