Исключение POCO websocket - PullRequest
       17

Исключение POCO websocket

1 голос
/ 29 апреля 2019

Мне нужно создать WebSocket связь между сервером C ++ и угловым клиентом. Я использовал библиотеку POCO и пример websocket server . Мне удалось обменяться данными между сервером и клиентом.

Моя проблема заключается в том, что при обновлении веб-страницы (F5) сервер закрывается.

Каким исключением я должен управлять?

class WebSocketRequestHandler : public HTTPRequestHandler
    /// Handle a WebSocket connection.
{
public:
    void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
    {
        Application& app = Application::instance();
        try
        {
            WebSocket ws(request, response);
            app.logger().information("WebSocket connection established.");
            char buffer[1024];

        do
        {

        n = ws.receiveFrame(buffer, sizeof(buffer), flags); 

            cout << buffer << endl;

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

        app.logger().information("WebSocket connection closed.");

    }
    catch (WebSocketException& exc)
    {
        app.logger().log(exc);
        switch (exc.code())
        {
        case WebSocket::WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION:
            response.set("Sec-WebSocket-Version", WebSocket::WEBSOCKET_VERSION);

        case WebSocket::WS_ERR_NO_HANDSHAKE:

        case WebSocket::WS_ERR_HANDSHAKE_NO_VERSION:

        case WebSocket::WS_ERR_HANDSHAKE_NO_KEY:

        response.setStatusAndReason(HTTPResponse::HTTP_BAD_REQUEST);
        response.setContentLength(0);
        response.send();
        break; 
        }
    }
    }
};

1 Ответ

0 голосов
/ 06 мая 2019

Я также ловлю Poco::Exception в моем приложении. Работает хорошо, без сбоев:

catch (WebSocketException& exception)
{
    switch (exception.code())
    {
    case WebSocket::WS_ERR_HANDSHAKE_UNSUPPORTED_VERSION:
        response.set("Sec-WebSocket-Version", WebSocket::WEBSOCKET_VERSION);
        // No break, fall through
    case WebSocket::WS_ERR_NO_HANDSHAKE:
    case WebSocket::WS_ERR_HANDSHAKE_NO_VERSION:
    case WebSocket::WS_ERR_HANDSHAKE_NO_KEY:
        response.setStatusAndReason(HTTPResponse::HTTP_BAD_REQUEST);
        response.setContentLength(0);
        response.send();
        break;
    }
}
catch (Poco::Exception& exception)
{
    _logger.error("[%s] handle request {%s}", caller(), exception.displayText());
}
...