Possible Duplicate:
How to set a timeout on blocking sockets in boost asio?升壓ASIO超時
我看了一些條目約超時之前,但我不明白。
我想爲連接定義的超時。 連接代碼看起來像:
我也想讀取超時。
我使用boost::asio::read_until(m_socket, response, "\r\n");
來讀取標題。
是有可能組簡單的超時?
Possible Duplicate:
How to set a timeout on blocking sockets in boost asio?升壓ASIO超時
我看了一些條目約超時之前,但我不明白。
我想爲連接定義的超時。 連接代碼看起來像:
我也想讀取超時。
我使用boost::asio::read_until(m_socket, response, "\r\n");
來讀取標題。
是有可能組簡單的超時?
首先我相信你應該總是使用異步方法,因爲它們更好,你的設計只會受益於反應堆模式方法。 在不好的情況下,你很匆忙,而且你還有一些原型,同步方法可能很有用。在這種情況下,我確實同意,如果沒有超時支持,他們不能在現實世界中使用。
我所做的很簡單:
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宏。
是否有一些我必須包含的庫來完成這項工作? – 2013-03-16 15:57:24
給出錯誤:'HttpClientImpl'還沒有被聲明 – 2014-03-13 07:16:59
你能幫我找到你的答案爲什麼[不起作用](http://stackoverflow.com/questions/33668717/boost-asio-blocking-mode-timeout- on-native-socket-handle-is-not-working)對我來說? – 2015-11-12 10:37:36
使用boost :: ASIO和採用同步調用像read_until不允許容易設定超時。
我建議轉移到異步調用(如async_read),並將其與deadline_timer結合來實現此目標。
+1用於推薦異步呼叫。 – 2011-05-19 03:04:53
祝你好運async asio。我使用它們時發生了神祕的崩潰,而不是經常發生,但足以懷疑應用程序的穩定性。當我切換到每個具有同步asio的多個線程時,它們全部消失。 – wallyk 2011-05-19 03:42:31
對不起,你有boost :: asio的問題。雖然這絕對是一個學習曲線,並且有很多事情必須「恰到好處」完成,但我發現,在網絡負載較重的情況下跨平臺開發應用程序(以至於像select()這樣的同步調用, ,造成了嚴重的瓶頸),boost :: asio表現非常出色,給予了肯定的好處。 – Chad 2011-05-19 18:28:30
閱讀[如何設置阻塞套接字超時](http://stackoverflow.com/questions/291871/how-to-set-a-timeout-on-blocking-sockets-in-boost-asio)它似乎沒有簡單的方法。 – 2011-05-18 07:56:57