Websocket сервер в C ++ ошибка программирования - PullRequest
3 голосов
/ 09 марта 2012

Я пытаюсь создать программу сервера websocket. Вот код подтверждения связи. Однако, когда я пытаюсь подключиться с помощью Chrome, соединение сбрасывается. Проверьте это и посмотрите, сможете ли вы найти какую-либо ошибку.

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) 
    {

        char *s = strstr(recvbuf,"Sec-WebSocket-Key:");
        s = s + strlen("Sec-WebSocket-Key:");

        char  buff[200] = {};
        int i = 0;
        while((int)*s != 13)
        {
            if((int)*s != 32)
            {
                buff[i] = *s;
                i++;
            }
            s++;
        }
        buff[i] = '\0';
        strcat(buff,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
        hashwrapper *myWrapper = new sha1wrapper();
        std::string hash(myWrapper->getHashFromString(buff));

        std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash.c_str()), hash.length());

        char * handshakeFormat = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
    "Upgrade: WebSocket\r\n"
    "Connection: Upgrade\r\n"
    "Sec-WebSocket-Accept: %s\r\n\r\n";

        memset(recvbuf,0,sizeof(recvbuf));
        sprintf(recvbuf,handshakeFormat,encoded.c_str());
                iSendResult = send( ClientSocket, recvbuf, iResult, 0 );


        delete myWrapper;
        myWrapper = NULL;
    }

Для целей тестирования:

key = "dGhlIHNhbXBsZSBub25jZQ =="

уникальный ключ = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

sha1 hash: "b37a4f2cc0624f1690f64606cf385945b2bec4ea"

Это производится моей хэш-функцией sha1.

фактический хэш sha1 согласно RFC6455 : "0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea "

base64 encoded = "YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ =="

Это производится моим кодером base64

фактическая кодировка base64 согласно RFC6455 : "s3pPLMBiTxaQ9kYGzzhZRbK + xOo ="

Google Chrome отправляет данные рукопожатия в формате:

GET /?encoding=text HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:2000
Origin: http://www.websocket.org
Sec-WebSocket-Key: SEvjVT+KuQHF0TRSdop3GA==
Sec-WebSocket-Version: 13

1 Ответ

1 голос
/ 09 марта 2012

Вы должны закодировать байтовые значения хэша.Прямо сейчас вы конвертируете хеш в шестнадцатеричную строку перед ее кодированием.

Декодируйте "s3pPLMBiTxaQ9kYGzzhZRbK + xOo =" и конвертируете вывод в шестнадцатеричную строку, и вы увидите, что этоB3 7A 4F 2C C0 62 4F 16 90 F6 46 06 CF 38 59 45 B2 BE C4 EA

"YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==" , с другой стороны, при декодировании приводит к (строка) 686ff6646b637b6376b637b637b637b637b637b637a

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