c++ - 使用 POCO C++ 的非阻塞 WebSocket 服务器

标签 c++ websocket poco-libraries

我正在尝试使用 POCO 构建 WebSocket 服务器。 我的服务器应该在一个时间间隔内一直向客户端发送数据。当客户端发送一些数据时,服务器应该处理它发送给客户端的数据。

我的WebSocketRequestHandler 中的handleRequest 方法:

void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
    WebSocket ws(request, response);
    char buffer[1024];
    int flags = 0;
    int n = 0;

    do {
        // recieving message
        n = ws.receiveFrame(buffer, sizeof(buffer), flags);
                   // ... do stuff with the message

        // sending message
        char* msg = (char *) "Message from server"; // actually manipulated, when message recieved
        n = sizeof(msg);
        ws.sendFrame(msg, strlen(msg), WebSocket::FRAME_TEXT);

        sleep(1);  // time intervall sending messages
    } while (n > 0 || (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
}

问题是,该方法会卡在 we.recieveFrame() 中,直到它获得一个帧。
那么我该如何解决这个问题,receiveFrame() 不会阻塞循环。
是否有更好的方法来解决这个完整的问题?

谢谢。

最佳答案

您应该设置接收超时。

ws.setReceiveTimeout(timeout);

因此,您将在每次超时微秒时收到一个 Poco::TimeoutException,您可以做所有您需要的事情,包括通过该 websocket 发送数据。

ws.setReceiveTimeout(1000000);//a second
do{
  try{
    int n = ws.receiveFrame(buffer, sizeof(buffer), flags);
    //your code to manipulate the buffer
  }
  catch(Poco::TimeoutException&){
    ....
  }
  //your code to execute each second and/or after receive a frame
} while (condition); 

关于c++ - 使用 POCO C++ 的非阻塞 WebSocket 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558089/

相关文章:

C++ Poco - 如何创建 NotificationQueue 的 vector ?

c++ - Poco::Base64Decoder 流不返回完整的字符串

c++ - 按地址调用数组函数时出现意外输出

c++ - 如何在 Qt .js 文件中使用 C++ 枚举?

带有sql连接器的C++无需请求太多数据即可获取元数据

c++ - 如何使用 POSIX 线程实现阻塞读取

javascript - 后端/服务器端语言实际上是做什么的?

javascript - 服务器发送事件与 websockets?

WebSocket - 有效负载长度

c++ - Poco HTTPClientSession.receiveResponse 返回状态 200 但在 C++11 中响应为空?