Увеличить тайм-аут 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);
   }
}

также я хочу тайм-аут чтения.

я использую boost::asio::read_until(m_socket, response, "\r\n"); для чтения в шапке.

Можно ли установить ПРОСТОЙ тайм-аут?

2 ответа

Решение

Во-первых, я считаю, что вы ВСЕГДА должны использовать асинхронные методы, так как они лучше, и ваша конструкция выиграет только от подхода с использованием реактора. В плохом случае, когда вы спешите и создаете прототип, методы синхронизации могут быть полезны. В этом случае я согласен с вами, что без поддержки тайм-аута они не могут быть использованы в реальном мире.

То, что я сделал, было очень просто:

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.

Использование boost::asio и синхронные вызовы, такие как read_until, не позволяют легко установить время ожидания.

Я бы предложил перейти к асинхронным вызовам (например, async_read) и объединить их с deadline_timer для достижения этой цели.

Другие вопросы по тегам