WebSocket握手期间出错:Sec-WebSocket-Accept不匹配

时间:2013-02-22 11:45:48

标签: c++ c websocket

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:53000
Origin: null
Sec-WebSocket-Protocol: hmiModel
Sec-WebSocket-Key: Hbw2xjBq6OTGXzxeuqrdVQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

这是我在Chrome浏览器上从客户端获得的请求密钥。 之后我将密钥与魔术字符串连接起来。

  

魔术弦是258EAFA5-E914-47DA-95CA-C5AB0DC85B11

然后我使用SHA1算法,我得到了以下哈希值

  

a5877edcaa04801d07c5687aad3a6cf03d26ad5c

然后我使用base64对上述值进行编码,并将加密值设为

  

Nzg1YWNkZTc0MGFhZDEwODVjNzA =

然后我将响应握手发送给客户端

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Charset: ISO8859-1,UTF-8
Connection: keep-alive, Upgrade
WebSocket-Origin: localhost
WebSocket-Location: localhost
WebSocket-Protocol: hmiModel
Sec-webSocket-Version: 13
Sec-WebSocket-Accept: Nzg1YWNkZTc0MGFhZDEwODVjNzA=

但是在控制台中我得到的错误为“ WebSocket握手时出错:Sec-WebSocket-Accept mismatch

因为这个错误导致onopen和onmessage事件没有被触发。

任何人都可以告诉我我在哪里犯了错误吗?

1 个答案:

答案 0 :(得分:0)

我没有检查你的计算结果,但你的中间哈希值看起来很长。使用RFC4634中的SHA1代码,我使用如下代码来计算握手响应

std::string key;
// populate key with content of Sec-WebSocket-Key header
key.append("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
SHA1Context* sha1ctx = (SHA1Context*)malloc(sizeof(*sha1ctx));
(void)SHA1Reset(sha1ctx);
(void)SHA1Input(sha1ctx, key.c_str(), key.size());
uint8_t digest[SHA1HashSize];
(void)SHA1Result(sha1ctx, digest);
free(sha1ctx);
// convert std::string(&digest[0], sizeof(digest)) to base64

如果您想要更具体的反馈,请编辑您的问题以包含您的等效代码。