提升asio超时[重复]

Posted

技术标签:

【中文标题】提升asio超时[重复]【英文标题】:boost asio timeout [duplicate] 【发布时间】:2011-08-27 19:33:09 【问题描述】:

可能重复:How to set a timeout on blocking sockets in boost asio?

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

我想要一个定义的连接超时。 连接代码如下:

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"); 读取标题。

是否可以设置 SIMPLE 超时?

【问题讨论】:

阅读how to set a timeout on blocking socket看来没有捷径可走。 【参考方案1】:

首先,我认为您应该始终使用异步方法,因为它们更好,并且您的设计只会从反应器模式方法中受益。 在您赶时间并且正在制作原型的糟糕情况下,同步方法可能很有用。在这种情况下,我同意你的观点,如果没有任何超时支持,它们就不能在现实世界中使用。

我做的很简单:

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 OS 上都可以工作。

【讨论】:

我是否必须包含一些库才能完成这项工作? 给出错误:'HttpClientImpl' 尚未声明 你能帮我找出为什么你的答案does not work为我吗? 设置套接字选项可能不会对 Asio 操作产生预期的影响。详情请见here。 真的有人用上面的代码用 Linux 实现了超时吗?使用 Windows 时一切正常。但是,当我使用 Ubuntu 编译和运行它时,两个 setsockop 调用都不会返回错误代码,但读取调用仍然阻塞?【参考方案2】:

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

我建议改用异步调用(如 async_read),并将其与截止日期计时器相结合以实现此目标。

【讨论】:

+1 推荐异步调用。 异步 asio 祝你好运。我在使用它们时遇到了神秘的崩溃,虽然不经常,但足以怀疑应用程序的稳定性。当我切换到每个使用同步 asio 的多个线程时,它们都消失了。 很抱歉您在使用 boost::asio 时遇到了问题。虽然这绝对是一个学习曲线,并且有很多事情必须“恰到好处”地完成,但我发现对于在繁重网络负载下的应用程序的跨平台开发(以至于像 select() 这样的同步调用, 造成了严重的瓶颈),boost::asio 的表现非常好,并带来了明确的好处。 @wally 异步编程很难正确,没有人会否认这一点。应用程序流控制的反转有时特别令人困惑。 @Chad 遗憾的是,当我使用不依赖于 Boost 的独立 asio 时,deadline_timer 不可用。关于如何使用独立的asio 实现这一目标的任何想法?

以上是关于提升asio超时[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用许多 boost::asio::deadline_timer [重复]

在 C++11 中对 boost::asio 套接字对象重复 std::move

C++ Boost ASIO:如何读取/写入超时?

Boost::Asio 同步客户端超时

如何在 boost asio 中设置阻塞套接字的超时时间?

C++ 提升 asio 多线程