|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Готов заплатить. Нужно составить ключ для протокола Websocket
Готов заплатить 20WMZ тому, кто поможет составить ответ сервера по протоколу Websocket(подробнее есть на Википедии).
Протокол вполне простой. Клиент присылает запрос(похоже на HTTP): Код:
GET /demo HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5 Host: example.com Sec-WebSocket-Key1: 12998 5 Y3 1 .P00 Origin: http://example.com WebSocket-Protocol: sample ^n:ds[4U Север должен дать ответ: Код:
HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS'y:G*Co,Wxa- То, что выделено красным цветом есть 16-байтное тело ответа, вычисляемое следующим образом: 1. из строки со значением заголовка запроса Sec-WebSocket-Key1 исключить все символы, не являющиеся цифрами (не попадающие в диапазон '0'..'9'); 2. полученную строку превратить в 64-битное целое число (для примера выше получим 1299853100); 3. полученное число разделить целочисленным делением на количество пробелов в исходной строке со значением заголовка; 4. полученное число представить в виде 4-х байтового 32-битного числа в формате big endian: старший байт хранится по нулевому смещению; 5. проделать то же самое с заголовком Sec-WebSocket-Key2; 6. интерпретируя числа из пунктов 4) и 5) как 4-х байтовые строки, конкатенировать их (сложить в одну строку) и добавить как строку тело запроса; 7. вычислить от полученной 16-байтной строки значение MD5 и записать это значение в тело ответа "как есть", без преобразования в какое-либо представление; Всё по пунктам понятно, но как отправить md5-хеш в виде этих кракозябр при помощи функции ServerSocket1.Socket.Connections[0].SendBuf??? |
#2
|
||||
|
||||
так а что не понятного. вычисляешь хеш:
Код:
uses IdHashMessageDigest ............... function md5(s: string): string; begin Result := ''; with TIdHashMessageDigest5.Create do try Result := AnsiLowerCase(AsHex(HashValue(s))); finally Free; end; end; и отправляешь его строчкой serverSocket1.Socket.Connections[0].SendText |
#3
|
|||
|
|||
Цитата:
SendText отправляет текстовые строки. И эта ваша функция вернёт строку такого плана d41d8cd98f00b204e9800998ecf8427e. Поэтому ответ сервера будет выглядеть так(смотрю сниффером портов): Код:
HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample d41d8cd98f00b204e9800998ecf8427e А надо так: Код:
HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS'y:G*Co,Wxa- |
#4
|
||||
|
||||
А если так
Код:
...................... IdHashMessageDigest, IdHash; ................. function md5(s: string): T4x4LongWordRecord; begin with TIdHashMessageDigest5.Create do try Result := HashValue(s); finally Free; end; end; только уже через sendbuff |