是否可以处理具有超时的阻塞读取功能?

时间:2019-04-12 09:59:48

标签: c++ boost websocket boost-asio boost-beast

我正在为asynchronous communication between the client and server开发boost网络套接字。

现在,我正在使用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);
}

这是我的程序输出的样子:从websocket收到的响应以灰色显示(cout << beast::buffers(ReadBuffer_.data());的输出),其余部分是打印在程序中各个位置的提示。 经过的时间以秒为单位

  

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。

1 个答案:

答案 0 :(得分:0)

或者您也可以仅使用1.70.0中的新Boost.Beast,它支持websocket操作上的内置超时:https://www.boost.org/doc/libs/1_70_0/libs/beast/doc/html/beast/using_websocket/timeouts.html