Poco WebSocket выбрасывает исключение с искаженным URL.Зачем? - PullRequest
1 голос
/ 03 июля 2019

Я пишу WebSocket на стороне сервера, используя Poco и c ++.Сейчас я пытаюсь принять HTTP-запрос на обновление до WebSocket.Когда я проверяю его, выдается сообщение о том, что запрос был искажен.Поэтому я открыл его в gdb, распечатал запрос и обнаружил, что это действительно не обычный запрос на обновление WebSocket.Вот вывод GDB.

(gdb) x/518xb buf
0x7fffffffb920: 0x16    0x03    0x01    0x02    0x00    0x01    0x00    0x01
0x7fffffffb928: 0xfc    0x03    0x03    0x8c    0x36    0x36    0x84    0x63
0x7fffffffb930: 0x9b    0x72    0x68    0x55    0xe2    0xad    0x61    0x63
0x7fffffffb938: 0xd8    0x05    0x94    0x69    0x6a    0x2e    0xf5    0x09
0x7fffffffb940: 0xac    0x10    0xc5    0xe8    0x6b    0x93    0x87    0x8f
0x7fffffffb948: 0x34    0xf6    0x4e    0x20    0xe6    0x1c    0x52    0xd6
0x7fffffffb950: 0x39    0xd4    0x46    0xae    0x03    0xe5    0x92    0xf3
0x7fffffffb958: 0x56    0x2e    0x33    0xc7    0x30    0x9a    0xc8    0xbd
0x7fffffffb960: 0xc6    0x72    0x82    0x47    0x2f    0x9a    0x2d    0xb4
0x7fffffffb968: 0x43    0x77    0x6d    0xbb    0x00    0x24    0x13    0x01
0x7fffffffb970: 0x13    0x03    0x13    0x02    0xc0    0x2b    0xc0    0x2f
0x7fffffffb978: 0xcc    0xa9    0xcc    0xa8    0xc0    0x2c    0xc0    0x30
0x7fffffffb980: 0xc0    0x0a    0xc0    0x09    0xc0    0x13    0xc0    0x14
0x7fffffffb988: 0x00    0x33    0x00    0x39    0x00    0x2f    0x00    0x35
0x7fffffffb990: 0x00    0x0a    0x01    0x00    0x01    0x8f    0x00    0x00
0x7fffffffb998: 0x00    0x0e    0x00    0x0c    0x00    0x00    0x09    0x6c
0x7fffffffb9a0: 0x6f    0x63    0x61    0x6c    0x68    0x6f    0x73    0x74
0x7fffffffb9a8: 0x00    0x17    0x00    0x00    0xff    0x01    0x00    0x01
0x7fffffffb9b0: 0x00    0x00    0x0a    0x00    0x0e    0x00    0x0c    0x00
0x7fffffffb9b8: 0x1d    0x00    0x17    0x00    0x18    0x00    0x19    0x01
0x7fffffffb9c0: 0x00    0x01    0x01    0x00    0x0b    0x00    0x02    0x01
0x7fffffffb9c8: 0x00    0x00    0x23    0x00    0x00    0x00    0x10    0x00
0x7fffffffb9d0: 0x0e    0x00    0x0c    0x02    0x68    0x32    0x08    0x68

Просто быстрый взгляд на гекс показывает, что это не обычные символы.Там много не буквенно-цифровых символов.Но когда я проверяю сетевую активность в браузере, он показывает текст запроса, как день.Так почему же байты, которые получает моя программа, отличаются от тех, которые, как утверждает браузер, отправляет?

Сторона сервера (c ++):

#include <iostream>
#include "Poco/Net/ServerSocket.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponseImpl.h"
#include "Poco/Net/HTTPServerRequestImpl.h"
#include "Poco/Net/HTTPServerConnection.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerSession.h"

#define PORT (unsigned short) 3000
#define MAX_BYTES 9999
int main()
{
        Poco::Net::ServerSocket x(PORT);
        Poco::Timespan timeout(25000000);
        char buf[MAX_BYTES];
        memset(buf,0,MAX_BYTES);
        if (x.poll(timeout, 1)) {
                Poco::Net::StreamSocket ss = x.acceptConnection();
                int i = ss.receiveBytes(buf, MAX_BYTES);
                printf("received %d bytes, %s\n", i, buf);
        }
        return 0;
}

Сторона клиента (javascript):

$(document).ready(function() {
    webSoc = new WebSocket("wss://localhost:3000");
    webSoc.onopen = function (event) {
        $("#c").click(function () {
            webSoc.send("Hello, World!\n");
        });
    }
});

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы подключаетесь через wss, что означает, что соединение будет зашифровано с использованием SSL или TLS.Они начинаются с рукопожатия, которое является первым байтом 0x16.Далее идет тип шифрования, 0x03 0x01 (TLS 1.0), затем длина 2 байта.Затем 0x01 означает, что клиент привет, и так далее.Так что это совершенно нормально.

Если вы хотите использовать простой HTTP-сеанс, используйте протокол ws.

0 голосов
/ 03 июля 2019

Я получил это буквально одним персонажем.Я изменил "wss://localhost:3000" на "ws://localhost:3000"

wss означает WebSocket Secure.Итак, мой веб-сокет шифровал данные перед отправкой.Серверный сокет пытался интерпретировать его так, как если бы он не был зашифрован, и правильно обнаружил, что он искажен для незашифрованного сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...