【发布时间】:2011-04-07 15:45:13
【问题描述】:
我正在尝试使用草稿 hixie-76 在 Delphi6 上构建 websocket 服务器,但我遇到了握手问题。
当我尝试使用这三个部分得到的 md5 指纹似乎不正确时,但是当我使用与协议规范中给出的示例相同的算法时,我得到了良好的 md5 响应......
我正在这样处理,将 key1 中找到的数字除以 32 位字中的空格数,与 key2 相同,最后添加最后 8 个字节(key3)以获得我使用的 128 位字符串作为 md5 条目。
对 key1 和 key2 使用 155712099、173347027 和对 key3 使用 'Tm[K T2u',我得到了正确的 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 响应的情况下编写的。
` 试试 // 读取请求头 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 做 开始 // 如果握手失败则关闭连接 服务器连接。断开连接; 结束;`
再次感谢
更新 2011 04 14
我终于找到问题所在了……
我是这样构建我的回复的:
resp := [...] +'Sec-WebSocket-Origin: '+ origin + #13#10 +
所以在md5指纹之前有3个0x0D 0x0A而不是2个......
#13#10#13#10 +
md5response;
由于我无法回答我自己的问题,我无法将其标记为已解决,但确实如此! :)
【问题讨论】:
-
欢迎来到 Stack Overflow!如果您需要在答案下方添加更多不适合作为评论的信息,请编辑您的问题。
标签: delphi md5 websocket delphi-6 handshake