2015-11-21 3 views
2

Есть ли способ проверить данные в течение определенного времени в asio?Проверьте данные с указанием времени?

У меня есть клиент с ASIO сокета, который имеет метод

bool ASIOClient::hasData() 
{ 
    return m_socket->available(); 
} 

И я хотел бы иметь какой-то задержки здесь, так что он проверяет данные на как 1 секунду макс и возвращает более Ealy. Более того, я не хочу опросить его по очевидной причине, что это займет секунду. Reaseon, почему я использую это, заключается в том, что я отправляю данные клиенту и жду ответа. Если он не отвечает в определенное время, я бы закрыл сокет. То, о чем упоминается hasData.

Я знаю, что это возможно с выбором и fd_set.


В ASIO на клиента создается в Accept метод класса сокета сервера, а затем используется для обработки запросов и отправки данных к тому, кто подключен здесь.

int ASIOServer::accept(const bool& blocking) 
{ 
    auto l_sock = std::make_shared<asio::ip::tcp::socket>(m_io_service); 
    m_acceptor.accept(*l_sock); 
    auto l_client = std::make_shared<ASIOClient>(l_sock); 
    return 0; 
} 
+0

Предпочитаете [опрос (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) на 'select' –

+0

@BasileStarynkevitch Я разрабатываю для Windows. Но я знаю, что могу выбрать с тайм-аутом (или здесь опрос). Но как я могу сделать это на сокете Asio? Имеет ли он какую-либо подобную функцию для этого? – BennX

+0

Это конкретная операционная система. Я ничего не знаю о Windows. Задайте другой вопрос (и пометьте его в Windows) –

ответ

1

Вам просто нужно попытке прочитать.

Обычный подход заключается в определении сроков для всех асинхронных операций, которые могут занимать «длинные» (или даже бесконечно долго).

Это вполне естественно в асинхронных исполнениях:

Просто добавьте таймер Deadline:

boost::asio::deadline_timer tim(svc); 
tim.expires_from_now(boost::posix_time::seconds(2)); 
tim.async_wait([](error_code ec) { 
     if (!ec) // timer was not canceled, so it expired 
     { 
      socket_.cancel(); // cancel pending async operation 
     } 
}); 

Если вы хотите использовать его с синхронными вызовами, вы можете с разумным использованием poll() вместо run(). См. Этот ответ: boost::asio + std::future - Access violation after closing socket, который реализует помощника await_operation, который запускает одиночные операции синхронно, но под таймаутом.

+0

спасибо за ответ. Я думаю, что это немного скупо, что его cald ASIOClient. Здесь это клиентский дескриптор сервера, поэтому в основном оболочка для записи и чтения не имеет своей собственной службы. – BennX

+0

И мой плохой, я пропустил, что я не использую boost, я использую ASIO как автономный, поэтому нет deadline_timer, если я вижу это правильно. – BennX

+0

Должен быть deadline_timer. Возможно, у вас также есть 'high_resolution_timer', который вы можете использовать (который использует C++ 11' std :: chrono :: high_resolution_clock') – sehe

Смежные вопросы