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

Non blocking WebSocket Server with POCO C++

本文关键字:WebSocket 服务器 POCO C++ 使用      更新时间:2023-10-16

我正在尝试用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); 

使用std::threadpthread并在线程的函数中调用阻塞函数