![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Готов заплатить 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 |