2017-01-26 10 views
3

POCO 1.7.5を使用してWebSocketサーバを設定しようとしています。POCOを使用してwebsocket PONG応答を送信する方法

POCOのサンプルがhereであることがわかりました。行111-122は、(sligthly清書)を読み取り:

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

しかし、このアプローチはフレームをピンポンによりピングフレームに答えるの世話をしていません。 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を使用したいだけです。

答えて

4

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

をそれについて考え、同じバッファを送信するためにいくつかのロジックを保持しているようです。 1日以内に試してみましょう。ありがとう –

+0

今私はrfc(6465)を読んでいます。これは、RFCsが進むにつれて非常に簡単であることが判明しました(セクション5.5.2と5.5.3はping pongを扱います)。実際にこの単純な場合は、POCOのサンプルを実際にアップグレードする必要があります。また、webSocket関数をアップグレードすると、自動的にこれをサポートします(初期化中に要求された場合)。すべてがうまくいけば、POCOフォーラムに投稿し、私がどのような反応を得るかを見ていきます。 –

-1
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); 
関連する問題