Я работаю над ускорением веб-сокетов для асинхронной связи между клиентом и сервером .
Теперь я печатаю истекшее время во время программы с 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.