2017-01-26 1 views
3

POCO 1.7.5를 사용하여 websocket 서버를 설정하려고합니다.POCO를 사용하여 websocket PONG 응답을 보내는 방법

POCO의 샘플은 here으로 잘 나타납니다. 라인 111-122은 (sligthly prettified) 읽

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

을 그것에 대해 생각, 같은 버퍼를 보내려면 몇 가지 논리를 개최 것으로 보인다. 하루 만에 시도해 볼 것입니다. 감사합니다 –

+0

그래서 지금 rfc (6465)를 읽었습니다. RFC (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); 
관련 문제