2

我用 c++ 编写了一个 websocket 服务器,它可以与 websocket 协议 00(握手标头中带有 key1、key2 的那个)正常工作。

现在有了新的更新,我正在尝试对握手工作的新方式做同样的事情。这是我的服务器对握手请求的响应:

"HTTP/1.1 101 切换协议\r\n升级:websocket\r\n连接:升级\r\nSec-WebSocket-Accept: " + serverKey + "\r\n\r\n";

其中 serverkey 计算正确。举个例子:

握手请求:
GET /test HTTP/1.1
升级:websocket
连接:升级
主机:192.168.123.102
Sec-WebSocket-Origin:http: //192.168.123.5
Sec-WebSocket-Key:YB0mPvJ5t8ggCeGUWY39uQ==
Sec-WebSocket-Version: 8

握手响应标头:
HTTP/1.1 101 切换协议
升级:websocket
连接:升级
Sec-WebSocket-Accept:xt9iyCNryQTseELUkHPWjzxA2ts=

我还用https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-08的示例检查了我的算法,它产生了完全相同的响应。

但是我仍然收到以下错误:
“WebSocket 握手期间出错:Sec-WebSocket-Accept mismatch”

我使用 chrome 15 作为我的浏览器。

你知道出了什么问题吗?

(也在 chrome 检查器网络中,它不显示响应,这是它不接受握手的情况(即使是旧版本))

4

2 回答 2

2

客户端发送数据时有不同的帧协议。以前这很简单。现在情况要复杂得多。请参阅 websockets rfc6455 规范。

https://www.rfc-editor.org/rfc/rfc6455#section-5.2

于 2012-01-16T07:20:24.860 回答
2

我实际上发现了主要问题是什么。

我用于 base64 编码的密钥是

YB0mPvJ5t8ggCeGUWY39uQ==
258EAFA5-E914-47DA-95CA-C5AB0DC85B11

代替

YB0mPvJ5t8ggCeGUWY39uQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

一个额外的 \n 是整个问题。

但是,现在我收到了 Connected 消息(ws 客户端已成功连接到 ws 服务器),我无法发送或接收任何内容。问题是服务器端

你知道自旧的 websocket 协议以来服务器端发生了什么变化吗?我只改变我的握手响应,这似乎还不够。

于 2011-12-06T18:15:03.020 回答