我正在编写一个嵌入式 WebSocket 服务器并直接根据相关 RFC 工作。
我的服务器正确响应来自浏览器的升级请求,并且浏览器(在其示例 javascript 中)继续通过新建立的套接字发送一条短消息。所以一切正常。
该消息很短(完整的帧只有 21 个字节)并且包含我的服务器很乐意解码的所有相关字段。
问题出在第 9 到 15 位,它们应该包含有效负载的长度。
以下是 WireShark 上捕获的消息的十六进制转储:
81 8f 11 ab d5 0b 5c ce a6 78 70 cc b0 2b 65 c4 f5 78 74 c5 b1
如您所见,第一个字节包含 FIN(1 位)、RSVD1(1 位)、RSVD2(1 位)、RSVD3(1 位)和操作码的 4 位。到目前为止,一切都很好。
8f
问题是:它包含 MASK 位和有效负载长度。 MASK 位设置为 1,这很好,但是当整个帧只有 21 字节长并且有效负载只有 15 字节长时,其余 7 位的值为 71 (0x47)。
那么我做错了什么?
我可以通过将 XOR 掩码应用于有效负载来解码消息,但长度是问题,因为它控制解码循环并进行 71 次迭代,而不是应有的 15 次迭代。
答案1
我的结构没有考虑到 AMD64 是小端排序,而不是大端排序。