我正在尝试用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::thread
或pthread
并在线程的函数中调用阻塞函数