首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强asio超时

增强asio超时
EN

Stack Overflow用户
提问于 2011-05-18 07:02:10
回答 2查看 14.1K关注 0票数 6

可能重复:

How to set a timeout on blocking sockets in boost asio?

我之前读过一些关于超时的条目,但我不明白。

我需要为连接定义一个超时。连接代码如下所示:

代码语言:javascript
复制
try{
  boost::asio::ip::tcp::resolver              resolver(m_ioService);
  boost::asio::ip::tcp::resolver::query       query(link.get_host(), link.get_scheme());
  boost::asio::ip::tcp::resolver::iterator    endpoint_iterator = resolver.resolve(query);
  boost::asio::ip::tcp::resolver::iterator    end;
  boost::system::error_code                   error   =   boost::asio::error::host_not_found;

  while (error && endpoint_iterator != end)
   {
    m_socket.close();
    m_socket.connect(*endpoint_iterator++, error);
   }
}

另外,我想要一个读超时。

我使用boost::asio::read_until(m_socket, response, "\r\n");读取标题。

可以设置一个简单的超时吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-31 11:53:39

首先,我认为您应该始终使用异步方法,因为它们更好,而且您的设计只会受益于反应堆模式方法。在这种情况下,您很匆忙,而且还有点原型化,同步方法可能很有用。在这种情况下,我同意您的观点,如果没有任何超时支持,它们就不能在现实世界中使用。

我所做的非常简单:

代码语言:javascript
复制
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
}

根据OS_WINDOWS宏,上面的代码可以在windows、Linux和MAC操作系统上运行。

票数 12
EN

Stack Overflow用户

发布于 2011-05-18 17:17:05

使用boost::asio和同步调用(如read_until )不允许轻松设置超时。

我建议转移到异步调用(如async_read),并将其与deadline_timer相结合来实现这一目标。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6041016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档