Я хотел бы сделать рукопожатие веб-сокета с delphi6

Я пытаюсь создать сервер веб-сокетов на Delphi6, используя черновик hixie-76, и у меня проблема с рукопожатием.

Отпечаток пальца md5, который я получаю с тремя частями, кажется неправильным, когда я пробую его, но когда я использую тот же алгоритм с примером, приведенным в спецификации протокола, я получаю хороший ответ md5...

Я обрабатываю так, преобразую число, найденное в ключе 1, деленное на количество пробелов в 32-битном слове, то же самое с ключом 2 и, наконец, добавляю последние 8 байтов (ключ 3), чтобы получить 128-битную строку, которую я использую как запись md5 .

используя 155712099, 173347027 для ключа1 и ключа2 и «Tm[K T2u» для ключа3, я получаю правильный отпечаток md5, и поэтому я не понимаю, почему этот алгоритм не дает правильный отпечаток клиенту

вот пример того, что я получаю:

GET / HTTP/1.1  
Upgrade: WebSocket  
Connection: Upgrade  
Host: localhost:8018  
Origin: null  
Sec-WebSocket-Key1: 4  102(2 6U 2 3  18  
Sec-WebSocket-Key2: 69V86`6t)e 0 2     42  


M]Rzÿõ&

и рукопожатие, которое я даю в ответ

HTTP/1.1 101 WebSocket Protocol Handshake  
Upgrade: WebSocket  
Connection: Upgrade  
Sec-WebSocket-Origin: null  
Sec-WebSocket-Location: ws://localhost:8018/  


µ&Mq˜8èõÙZÙ,hœi

Может быть, есть еще одна проблема с моим ответом, но, похоже, у меня проблема с моим отпечатком пальца md5.

Кто-нибудь видит, где моя ошибка??

Заранее спасибо за помощь

Обновить

Я видел этот модуль, но если я не очень плохо читаю, часть рукопожатия этого класса не вычисляет сумму md5, я думаю, что он использует более старую версию протокола, а не текущую (76)

Когда я смотрю на следующий код, я вижу, что ответ написан без ответа md5.

` try // Чтение заголовков запроса HandshakeRequest := TWebSocketRequest.Create(ServerConnection);

// Send response headers
ServerConnection.WriteLn('HTTP/1.1 101 Web Socket Protocol Handshake');
ServerConnection.WriteLn('Upgrade: WebSocket');
ServerConnection.WriteLn('Connection: Upgrade');
ServerConnection.WriteLn('WebSocket-Origin: ' + HandshakeRequest.Origin);
ServerConnection.WriteLn('WebSocket-Location: ws://' + HandshakeRequest.Host + '/');

// End handshake
ServerConnection.WriteLn;
ServerConnection.WriteLn;

HandshakeResponseSent := True;

кроме E: TWebSocketHandshakeException do begin // Закрыть соединение, если рукопожатие не удалось ServerConnection.Disconnect; конец;`

Еще раз спасибо

Обновление 2011 04 14

Наконец-то я нашел, в чем была проблема...

я строил свой ответ так:

resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
#13#10#13#10 +
md5response;
так что перед отпечатком md5 было 3 0x0D 0x0A вместо 2...

Поскольку я не могу ответить на свой вопрос, я не смогу отметить его как решенный, но это так! :)


person G.K.    schedule 07.04.2011    source источник
comment
Добро пожаловать в Stack Overflow! Если вам нужно добавить дополнительную информацию, которая не подходит в качестве комментария под ответом, просто отредактируйте свой вопрос.   -  person Tim Post♦    schedule 11.04.2011


Ответы (1)


В коде Google для Delphi существует класс websocket, который может дать вам ответ:

http://code.google.com/p/delphiws/source/browse/trunk/source/uWebSocket.pas?r=4

person Ritsaert Hornstra    schedule 08.04.2011