提升asio超时

Rob*_*oby 6 c++ boost timeout boost-asio

可能重复:
如何在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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我也想要读取超时.

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

可以设置SIMPLE超时吗?

Car*_*das 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
}
Run Code Online (Sandbox Code Playgroud)

根据OS_WINDOWS宏,上面的代码在Windows和Linux以及MAC OS上都有效.


Cha*_*had 5

使用boost :: asio和read_until之类的同步调用不允许轻松设置超时.

我建议转移到异步调用(如async_read),并将其与deadline_timer组合以实现此目标.

  • 抱歉,您在使用boost :: asio时遇到了问题.虽然它肯定是一个学习曲线,并且有许多事情需要"恰到好处"完成,但我发现在网络负载较重的情况下进行跨平台开发应用程序(直到像select()这样的同步调用,正在造成重大瓶颈),提升:: asio表现得非常好,并给予了明确的好处. (5认同)