2011-05-18 164 views
6

Possible Duplicate:
How to set a timeout on blocking sockets in boost asio?升壓ASIO超時

我看了一些條目約超時之前,但我不明白。

我想爲連接定義的超時。 連接代碼看起來像:

​​

我也想讀取超時。

我使用boost::asio::read_until(m_socket, response, "\r\n");來讀取標題。

是有可能組簡單的超時?

+0

閱讀[如何設置阻塞套接字超時](http://stackoverflow.com/questions/291871/how-to-set-a-timeout-on-blocking-sockets-in-boost-asio)它似乎沒有簡單的方法。 – 2011-05-18 07:56:57

回答

12

首先我相信你應該總是使用異步方法,因爲它們更好,你的設計只會受益於反應堆模式方法。 在不好的情況下,你很匆忙,而且你還有一些原型,同步方法可能很有用。在這種情況下,我確實同意,如果沒有超時支持,他們不能在現實世界中使用。

我所做的很簡單:

void HttpClientImpl::configureSocketTimeouts(boost::asio::ip::tcp::socket& socket) 
{ 
#if defined OS_WINDOWS 
    int32_t timeout = 15000; 
    setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); 
    setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout)); 
#else 
    struct timeval tv; 
    tv.tv_sec = 15; 
    tv.tv_usec = 0;   
    setsockopt(socket.native(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 
    setsockopt(socket.native(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); 
#endif 
} 

上面的代碼工作都在Windows和Linux上和MAC OS,根據OS_WINDOWS宏。

+1

是否有一些我必須包含的庫來完成這項工作? – 2013-03-16 15:57:24

+0

給出錯誤:'HttpClientImpl'還沒有被聲明 – 2014-03-13 07:16:59

+0

你能幫我找到你的答案爲什麼[不起作用](http://stackoverflow.com/questions/33668717/boost-asio-blocking-mode-timeout- on-native-socket-handle-is-not-working)對我來說? – 2015-11-12 10:37:36

3

使用boost :: ASIO和採用同步調用像read_until不允許容易設定超時。

我建議轉移到異步調用(如async_read),並將其與deadline_timer結合來實現此目標。

+0

+1用於推薦異步呼叫。 – 2011-05-19 03:04:53

+1

祝你好運async asio。我使用它們時發生了神祕的崩潰,而不是經常發生,但足以懷疑應用程序的穩定性。當我切換到每個具有同步asio的多個線程時,它們全部消失。 – wallyk 2011-05-19 03:42:31

+5

對不起,你有boost :: asio的問題。雖然這絕對是一個學習曲線,並且有很多事情必須「恰到好處」完成,但我發現,在網絡負載較重的情況下跨平臺開發應用程序(以至於像select()這樣的同步調用, ,造成了嚴重的瓶頸),boost :: asio表現非常出色,給予了肯定的好處。 – Chad 2011-05-19 18:28:30