Можно ли обработать блокирующую функцию чтения тайм-аутом? - PullRequest
2 голосов
/ 12 апреля 2019

Я работаю над ускорением веб-сокетов для асинхронной связи между клиентом и сервером .

Теперь я печатаю истекшее время во время программы с boost::timer::auto_cpu_timer,Он отображает время, прошедшее в секундах.

Ниже приведен мой фрагмент программы:

Эта функция отправляет данные в веб-сокет:

void WebSocketSession::WriteSocket(beast::error_code ec) {
    if (ec)
         return fail(ec, "ssl_handshake");
    cout << "Authorised" <<endl;

    //Start the timer
    BoostTimer.start();

    // Send the Data message
    ws_.async_write(net::buffer(DATAMSG),
            bind(&WebSocketSession::ReadSocket, shared_from_this(), placeholders::_1,placeholders::_2));
}

Эта функция читает ответ веб-сокета

void WebSocketSession::ReadSocket(beast::error_code ec, size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);
    if (ec)
         return fail(ec, "WriteSocket Failed");

    cout << "Time Elapsed before reading WS : " << TimeElapsed() << endl;

    try {
        ws_.read(ReadBuffer_);
    } catch (exception *e) {
        cerr << "Error: " << e->what() << endl;
    }

    cout << "Time Elapsed after reading WS : " << TimeElapsed() << endl;

    // Display the buffer into stringstream
    cout << beast::buffers(ReadBuffer_.data());

    // Clear the websocket buffer
    ReadBuffer_.consume(ReadBuffer_.size());

    cout << "Time Elapsed before moving ahead : " << TimeElapsed() << endl;

    // Decision tree

    // IsGstFileWriteDone() gives "true" when the file is written... that file is not related to this context. An event is pushed saying FILE_WRITE_DONE
        if (mIbmWatsonobj->IsGstFileWriteDone()){
            cout<< "Going to CloseSocket" << endl;
            WebSocketSession::CloseSocket(ec, 0);
        }else{
            cout<< "Going to ReadSocket" << endl;
            WebSocketSession::ReadSocket(ec, 0);
        }
}

Эта функция закрывает веб-сокет

void WebSocketSession::CloseSocket(beast::error_code ec, size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);
    if (ec)
        return fail(ec, "ReadSocket Failed");

    cout << "CLOSING" <<endl;

    // Close the WebSocket connection
    ws_.close(websocket::close_code::normal);
}

Вот как выводит моя программавыглядит так: Ответ, полученный от веб-сокета, показан серым цветом (вывод cout << beast::buffers(ReadBuffer_.data());), остальные - койки, напечатанные в разных местах программы. Время в секундах

IBM Authorized
Время, прошедшее до чтения WS: 0
Время, прошедшее после чтения WS: 0.3

{  
    "state": "listening"  
}

Время, прошедшее до продвижения вперед: 0,3
Переход к ReadSocket
Время, прошедшее до чтения WS: 0,3
Время, прошедшее после чтения WS: 2.1

{
   "results": [
      {
         "alternatives": [
            {
               "confidence": 0.89, 
               "transcript": "several tornadoes touch down as a line of severe some "
            }
         ], 
         "final": true
      }
   ], 
   "result_index": 0
}

Время, прошедшее до продвижения вперед:2.1
Переход к ReadSocket
Время, прошедшее до чтения WS: 2.1
Время, прошедшее после чтения WS: 2.1

{
   "state": "listening"
}

Время, прошедшее до продвижения вперед: 2.1
Переход к ReadSocket
Время, прошедшее до чтения WS: 2.1

Событие отправлено: FILE_WRITE_DONE

Время, прошедшее после чтения WS: 34

{
   "error": "Session timed out."
}

Время, прошедшее до продвижения вперед: 34

// ВЫХОДЫ ПРОГРАММЫ С -1

Вопрос:

Через 2.1 секунд программа снова переходит в ReadSocket, где ws_.read(ReadBuffer_);блокирует выполнение почти 32 сек до получениячто-то из сокета, в этом случае он получает "тайм-аут сеанса".

Как я могу перейти к CloseSocket, когда этот блок включен, скажем, на 5 секунд.То есть, если в какой-то момент времени у меня ws_.read блокируется мой код более чем на 5 секунд, я хочу выставить свое поведение, скажем, CloseSocket.

1 Ответ

0 голосов
/ 19 апреля 2019

Или вы можете просто использовать новый Boost.Beast в 1.70.0, который поддерживает встроенные тайм-ауты для операций websocket: https://www.boost.org/doc/libs/1_70_0/libs/beast/doc/html/beast/using_websocket/timeouts.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...