2011-05-18 157 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