2016-02-22 134 views
0

我想用POCO构建一个WebSocket服务器。 我的服务器应该在一段时间内向客户端发送数据并且一直发送数据。当客户端发送一些数据时,服务器应该处理发送给客户端的数据。使用POCO C++的非阻塞WebSocket服务器

handleRequest内我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); 
} 

的问题是,该方法得到stucked在we.recieveFrame(),直到它到达的帧。
那么我该如何解决这个问题,receiveFrame()没有阻止循环。
是解决这个完整问题的更好方法吗?

谢谢。

+0

'非阻塞' ......睡眠(1); –

+0

当然..你是对的:-) @MartinJames,但实际上它甚至没有达到这么远,当客户端不发送消息。 – daB0bby

+0

不知道你在做什么。如果你没有得到一个框架,你不会得到这个信息,那么你会发送什么? – SergeyA

回答

1

您应该设置接收超时。

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

使用std::threadpthread并调用阻挡功能在线程的功能