3

クライアントとサーバー間の非同期通信用のブースト Websockets に取り組んでいます。

現在、プログラム中に経過した時間boost::timer::auto_cpu_timerを で出力しています。経過時間を秒単位で表示しています。

私のプログラムのスニペットを以下に示します。

この関数は、データを websocket に送信します。

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));
}

この関数は、websocket 応答を読み取ります

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);
        }
}

この関数は Web ソケットを閉じます

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);
}

私のプログラム出力は次のようになります。 websocket から受信した応答は灰色で表示されます (の出力cout << beast::buffers(ReadBuffer_.data());) 残りは、プログラムのさまざまな場所に出力される couts です。経過時間は秒単位です

IBM 認定
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 秒間実行をブロックします。この場合、「セッション タイムアウト」を受け取ります。

このブロックが 5 秒間オンになっている間に、どうすれば CloseSocket に移動できますか。つまり、いつでもws_.readコードを 5 秒以上ブロックしている場合は、CloseSocket などの動作を実行したいと考えています。

4

1 に答える 1