1

大家好,提前感谢,

根据 RFC 6455,我正在 C++ 中滚动我自己的 WebSocket 服务器(我今天早上也在 C# 中快速滚动了一个以仔细检查这里发生了什么)

我已经阅读了标准,现在我有一个服务器可以成功地与客户端建立连接。我可以完成握手,并从另一端正确接收的简单测试客户端发送数据。

在使用 FireFox/JS 测试向我的服务器发送数据时,我在服务器端收到一堆乱码。我已经使用 WireShark 监控了套接字,并确定服务器正在正确接收数据,但是我无法解释它。

我正在尝试将字符串“test”(不带引号)发送到我的服务器,最后一次尝试看起来像这样:

0x81
0x84
0x1e
0x31
0x65
0xaf
0x6a
0x54
0x16
0xdb

这些字符中的大多数甚至都不是可打印的字符,并且每次我单击发送时,这些值都会发生变化(除了0x81始终是第一个字符。注意:这是在尝试按照规范修剪0x00和填充之前。0xFF

在 FireFoxs 握手请求中,它确实指定了 Accept-Encoding,如下所示:

Accept-Encoding: gzip, deflate

但是,我尝试使用 GZIP 和 DEFLATE 解压缩,都抛出错误。我还尝试将 Lorem Ipsum 发送到服务器,结果相同(0x81 后跟一堆字符)

任何人都可以对此有所了解吗?这实际上是压缩的吗?为什么每次发送相同的字符串都会给出不同的结果?FireFox 是否为传出数据添加时间戳?我想要的只是将服务器端的字符串正确解释回“测试”

这是来自 FireFox 的完整请求:

GET / HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: lXen8aJPlv/0JOZBb4WAtA==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

这是我的服务器的完整回复:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: WHTW6PSJ/pWIPskBw0owBT/jacw=

这是成功的,即使在 javascript 结束时我也得到了 OPEN,然后当我单击一个按钮调用 send("test") 时,我收到了上面第一个代码块中显示的垃圾......

4

1 回答 1

3

查看 RFC 6455 的第 5.3 节(https://www.rfc-editor.org/rfc/rfc6455#section-5.3)。客户端到服务器的 websocket 消息使用 XOR 和在消息头中发送的密钥进行屏蔽。您将需要解开此密钥并使用它来解码消息。不涉及压缩。

在您的具体示例中,前六个字节是帧头。帧头的最后四个字节是掩码键。如果您将四个屏蔽密钥字节与剩余的四个有效负载字节进行异或运算,您应该将“测试”字符串取出。

于 2013-05-24T12:46:24.100 回答