dab0bby
dab0bby

Reputation: 3001

Non blocking WebSocket Server with POCO C++

I'm trying to build a WebSocket server with POCO. My Server should send data to the client and all the time within a time intervall. And when the client sends some data, the sever should manipulate the data it send to the client.

My handleRequest method within my WebSocketRequestHandler:

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

The problem is, that the method get stucked in we.recieveFrame() until it gets a frame.
So how can i solve this, that receiveFrame() is not blocking the loop.
Is the a better way to solve this complete problem?

Thanks.

Upvotes: 1

Views: 2854

Answers (2)

A. Gille
A. Gille

Reputation: 1048

Use a std::thread or pthread and call the blocking function in the thread's function

Upvotes: 0

Miguel Angel
Miguel Angel

Reputation: 640

You should set a receive timeout.

ws.setReceiveTimeout(timeout);

So, you will get a Poco::TimeoutException each timeout microseconds and you can do all you need, included send data by that 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); 

Upvotes: 1

Related Questions