大家好,并提前致谢,
我正在使用C ++编写我自己的WebSocket服务器(我今天早上也在C#中快速推出一个服务器,以便根据RFC 6455仔细检查这里发生了什么)
我已阅读标准,现在我有一台服务器可以成功与客户建立连接。我可以完成握手,并从另一端正确收到的简单测试客户端发送数据。
当测试使用FireFox / JS向我的服务器发送数据时,我在服务器端收到一堆乱码。我用WireShark监视套接字并确定服务器正确接收数据,但是我无法解释它。
我正在尝试将字符串“test”(没有引号)发送到我的服务器,最后一次尝试它是这样的:
0x81
0x84
0x1e
0x31
0x65
0xaf
0x6a
0x54
0x16
0xdb
这些中的大多数甚至都不是可打印的字符,每次我点击发送这些值都会改变(0x81
除外,它始终是第一个字符。注意:这是在尝试修剪{{根据规范填写1}}和0x00
。
在FireFoxs握手请求中,它确实指定了Accept-Encoding,如下所示:
0xFF
但是,我试图用GZIP和DEFLATE解压缩,两者都抛出错误。我也尝试将Lorem Ipsum发送到服务器,它具有相同的结果(0x81后跟一个字符串)
任何人都可以对此有所了解吗?这实际上是压缩的吗?为什么每次发送相同的字符串会产生不同的结果? FireFox是否为传出数据添加时间戳?我想要的是将服务器端的字符串正确解释为“test”
以下是FireFox的完整请求:
Accept-Encoding: gzip, deflate
这是我的服务器全部回复:
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
这是成功的,我甚至在javascript端获得OPEN,然后当我点击一个按钮来调用send(“test”)时,我收到上面第一段代码中显示的垃圾...
答案 0 :(得分:3)
查看RFC 6455(http://tools.ietf.org/html/rfc6455#section-5.3)的第5.3节。使用XOR和在消息头中发送的密钥来屏蔽客户端到服务器的websocket消息。您需要打开此密钥并使用它来解码消息。没有涉及压缩。
在此处的具体示例中,前六个字节是帧头。帧头的最后四个字节是屏蔽密钥。如果您使用剩余的四个有效负载字节对四个屏蔽密钥字节进行异或,则应该将“测试”字符串取回。