簡體   English   中英

Boost.Asio:在async_read上取消了操作

[英]Boost.Asio: Operation Cancelled on async_read

我自己與Boost.Asio繼續傳奇的另一個...

我有一個簡單的異步客戶端和服務器,它使用async_write和async_read進行通信。 客戶端可以成功地將字節寫入套接字,但服務器永遠不會看到它們; 我在服務器上的讀取處理程序失敗並顯示“取消操作”。

我傾向於認為這可能是客戶端在服務器嘗試讀取並失敗寫入數據的時間問題,但我原本認為數據將在套接字上等待(除非套接字已經在此期間關閉)。

為了測試這個,我只是在錯誤處理程序中重新運行讀取操作,即

read_handler()
{
    if (!error) {
        /* bytes read */
    } else {
        async_read(socket, buffer, read_handler)
    }
}

但是這一切都讓我通過調用async_receivepthread_mutex_lock出現了段async_receive

任何人都可以指出我的任何相關信息的方向(或者,更好的是,告訴我到底我做錯了什么;))?

更新 :服務器和客戶端基於Asio文檔中的聊天服務器示例,客戶端和服務器都在相同的進程下運行(這可能是一個問題嗎?想多一點,他們都使用相同的io_service ...) ; 異步和使用Boost 1.44.0。 我正在研究OS X,但這在Linux上也是可重現的。

更新II :我的預感是正確的,如果給服務器和客戶端單獨的io_service對象,async_read會看到套接字上的字節。 這仍然會在boost::asio::detail::kqueue_reactor::post_immediate_completion中給出一個boost::asio::detail::kqueue_reactor::post_immediate_completion ,它似乎源於io_service.run() 在我進一步討論之前,使用單獨的io_service對象是正確的方法嗎?

當套接字關閉或取消時,將發送取消操作(operation_aborted錯誤代碼)。

很可能你的連接超出了范圍。

也許因為它發生在我身上,你忘了將async_handlers附加到shared_from_this ()指針。 即你應該像這樣附上你的處理程序:

async_read(m_socket,
           boost::asio::buffer((void*)m_buffer, m_header_size),
           boost::bind(&TcpConnection::handleRead, 
           shared_from_this(),
           boost::asio::placeholders::error,
           boost::asio::placeholders::bytes_transferred));

不是這樣的:

async_read(m_socket,
           boost::asio::buffer((void*)m_buffer, m_header_size),
           boost::bind(&TcpConnection::handleRead, 
           this, //<- This will go out of scope and the socket will be closed
           boost::asio::placeholders::error,
           boost::asio::placeholders::bytes_transferred));

暫無
暫無

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

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