c++ - WebSocket握手时出错: Sec-WebSocket-Accept mismatch

标签 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 浏览器客户端获得的请求 key 。 之后我将 key 与 Magic String 连接起来。

Magic string is 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 不匹配

这样 onopen 和 onmessage 事件就不会因为这个错误而触发。

谁能告诉我我哪里做错了?

最佳答案

我还没有检查你的计算输出,但你的中间哈希值看起来很长。使用 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

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

关于c++ - WebSocket握手时出错: Sec-WebSocket-Accept mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023481/

相关文章:

c++ - 如何将 PreShutdown 事件添加到 ATL 服务?

c - 从 `forkpty` 子进程读取 : `ls/` output yields `EIO`

javascript - node.js socket.io 客户端和服务器

c++ - 使用 QSocketNotifier 在字符设备上进行选择。

c++ - 如何在函数内 GMOCK 一个函数?

c++ - cv::VideoWriter 产生不可读的视频

python - 使用 libmodbus C 为 Open-WRT 路由器编写 modbus 程序(将 Python 应用程序重写为 C)

c - 第 11 章 C Kochan 编程中的练习 6,查找位模式

java - 多个用户的 Spring websocket 安全性

java - WebSockets - 创建 channel 和推送数据的正确方法