如何使用 POCO 发送 websocket PONG 响应

How to send websocket PONG response using POCO

我正在尝试使用 POCO 1.7.5 设置一个 websocket 服务器。

来自 POCO 的示例发现 here 效果很好。第 111-122 行读取(稍微美化):

WebSocket ws(request, response);
char buffer[1024];
int n, flags;

do
{
    n = ws.receiveFrame(buffer, sizeof(buffer), flags);
    ws.sendFrame(buffer, n, flags);
}
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);

但是,这种方法不负责通过 pong 帧来应答 ping 帧。如何使用 POCO 正确执行此操作?我尝试了以下,但我不知道它是否正确:

WebSocket ws(request, response);
char buffer[1024];
int n, flags;

do
{
    n = ws.receiveFrame(buffer, sizeof(buffer), flags);
    if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PING){
        buffer[0] = WebSocket::FRAME_OP_PING;
        ws.sendFrame(buffer, 1, WebSocket::FRAME_OP_PONG);
    }
    else{
        ws.sendFrame(buffer, n, flags);
    }
}               
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);

不知道这是否是正确的做法,也无法在线找到操作方法,包括 POCO 文档。 websocket RFC 6465 包含大量信息,但我不想去那里,因为我只是想在这里使用 websocket 作为应用程序程序员

在 RFC 中,您必须发送带有 WebSocket::FRAME_OP_PONG 标志的相同缓冲区。 试试这个:

do
{
    n = ws.receiveFrame(buffer, sizeof(buffer), flags);
    if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PING) {
        ws.sendFrame(buffer, n, WebSocket::FRAME_OP_PONG);
    }
    else {
        ws.sendFrame(buffer, n, flags);
    }
}               
while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
do
{
    nbytes = ws->receiveFrame(buffer, sizeof(buffer), flags);
    if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PING) {
        std::cout << "PING received\n";
        if (nbytes == 0) nbytes = 1; // Poco destroys active session if we send zero length string
        ws->sendFrame(buffer, nbytes, WebSocket::FRAME_FLAG_FIN | WebSocket::FRAME_OP_PONG);
        std::cout << " PONG sent\n";
        continue;
    }
    if ((flags & WebSocket::FRAME_OP_BITMASK) == WebSocket::FRAME_OP_PONG) {
        std::cout << "PONG received\n";
        continue;
    }
    std::cout << nbytes << " bytes received from server:\n";

} while (nbytes > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);