提升 ASIO 超时

boost asio timeout

本文关键字:超时 ASIO 提升      更新时间:2023-10-16

可能的重复项:
如何在升压 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, "rn");来读取标题。

是否可以将 SIMPLE 设置为超时?

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

我所做的非常简单:

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上都有效。

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

我建议转向异步调用(如async_read),并将其与deadline_timer相结合以实现此目标。