2017-01-26 8 views
3

Ich versuche, einen WebSocket-Server mit POCO 1.7.5 einrichten. Die Probe von POCO here funktioniert gut. 111-122 Zeilen liest (sligthly prettified):Wie WebSocket PONG Antwort mit POCO senden

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

Doch dieser Ansatz nicht Pflege von Pong Rahmen Ping Rahmen der Beantwortung dauert. Wie mache ich das richtig mit POCO? Ich habe versucht, die folgenden, aber ich weiß nicht, ob es richtig ist:

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

weiß nicht, ob dies der richtige Weg ist, es zu tun, und nicht finden kann, wie es online zu tun, einschließlich der POCO-Dokumentation. Die websocket RFC 6465 hält viele Informationen, aber ich will nicht dorthin gehen, da ich nur die Websocket als Anwendungsprogrammierer hier verwenden möchte

Antwort

4

Von RFC müssen Sie den gleichen Puffer mit WebSocket :: FRAME_OP_PONG Flag senden. Try this:

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

darüber nachzudenken, scheint es eine gewisse Logik zu halten, den gleichen Puffer zu senden. Wird es innerhalb eines Tages versuchen. Danke –

+0

So jetzt lese ich die RFC (6465), die sich als sehr einfach erweist, wie RFCs gehen (Abschnitte 5.5.2 und 5.5.3 befasst sich mit Ping-Pong). Wenn es tatsächlich so einfach ist, sollte das POCO-Beispiel wirklich aktualisiert werden, und/oder die webSocket-Funktion muss aktualisiert werden, um dies automatisch zu unterstützen (wenn dies während der Initialisierung angefordert wird). Wenn alles gut geht, werde ich auf dem POCO-Forum posten und sehen, welche Antwort ich bekomme. –

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