2015-11-21 96 views
2

有沒有辦法在asio中檢查特定時間的數據?檢查數據與時間?

我有一個客戶端,其中有一個方法

bool ASIOClient::hasData() 
{ 
    return m_socket->available(); 
} 

的ASIO插座,我想有某種延遲的這裏,所以它會檢查數據像最長1秒,並返回更多EALY。此外,我不想因爲顯而易見的原因進行民意調查,因爲它明顯需要一秒鐘的時間。爲什麼我使用這種方法是因爲我發送數據給客戶端並等待響應。如果他在一段時間內沒有響應,我會關閉套接字。那就是hasData提到的。

我知道使用select和fd_set是可能的。


的ASIO客戶端的服務器套接字類的接受方法創建的,後來用於處理請求和數據發送回誰在這裏連接了一個。

int ASIOServer::accept(const bool& blocking) 
{ 
    auto l_sock = std::make_shared<asio::ip::tcp::socket>(m_io_service); 
    m_acceptor.accept(*l_sock); 
    auto l_client = std::make_shared<ASIOClient>(l_sock); 
    return 0; 
} 
+0

首選[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)到'select' –

+0

@BasileStarynkevitch我正在爲Windows開發。但我知道我可以選擇超時(或在這裏投票)。但是,我怎麼能在一個Asio插座上做到這一點?它是否有任何simelar功能? – BennX

+0

它是特定於操作系統的。我對Windows一無所知。問另一個問題(並用Windows標記) –

回答

1

你只需要試圖讀取

通常的做法是爲可能需要「很長」(甚至無限期地)的所有異步操作定義最終期限。

這是異步執行很自然:

只需加一個期限定時器:

boost::asio::deadline_timer tim(svc); 
tim.expires_from_now(boost::posix_time::seconds(2)); 
tim.async_wait([](error_code ec) { 
     if (!ec) // timer was not canceled, so it expired 
     { 
      socket_.cancel(); // cancel pending async operation 
     } 
}); 

如果你想與同步調用使用它,你可以明智地使用poll()代替run()。看到這個答案:boost::asio + std::future - Access violation after closing socket它實現了一個幫手await_operation,同步運行一個操作但在超時。

+0

感謝您的答案。我認爲它的馴服ASIOClient有點令人誤解。在這裏它是一個服務器的Clienthandle,所以基本上用於編寫和閱讀它的包裝器沒有自己的服務。 – BennX

+0

而我的錯,我錯過了我不使用提升我使用ASIO作爲獨立,所以沒有deadline_timer如果我看到的權利。 – BennX

+0

應該有deadline_timer。也許你也有'high_resolution_timer'你可以使用(它使用C++ 11'std :: chrono :: high_resolution_clock') – sehe