Websocket - Chrome抱怨掩码位设置



我已经在现有的服务器中实现了websocket服务器。握手很好,然后我甚至可以发送第一条消息,客户端浏览器会收到它。但是任何后续消息都会断开 websocket。在铬上,我收到以下错误。

failed: A server must not mask any frames that it sends to the client.

我的框架是这样创建的

Len = erlang:size(Msg),
if
        Len < 126 ->
             Message = [<<1:1, 0:3,2:4,0:1,Len:7>>,Msg];
        Len < 65536 ->
             Message = [<<1:1, 0:3,2:4,0:1,126:7,Len:16>>,Msg];
        true ->
             Message = [<<1:1, 0:3,2:4,0:1,127:7,Len:64>>,Msg]
 end,

现在要传输的一个示例数据如下所示 <<130,46,60,115,110,112,95,105,110,102,111,32,97,118,95,112,111,116,61,34,49,49,34,32,104,97,110,100,115,95,112,101,114,95,104,111,117,114,61,34,48,46,50,48,34,32,47,62>>

正如您在上面的代码中看到的,我的掩码位始终设置为 0,但我不知道为什么相同的消息第一次工作,然后我再次发送相同的消息,它抱怨掩码位设置。

有人知道为什么吗?谢谢

您粘贴的帧示例数据是合理的。

48 bytes
ErlangSampleBytes[48] = 82 2E 3C 73 6E 70 5F 69  6E 66 6F 20 61 76 5F 70
                        6F 74 3D 22 31 31 22 20  68 61 6E 64 73 5F 70 65
                        72 5F 68 6F 75 72 3D 22  30 2E 32 30 22 20 2F 3E 

它解析/转换为:

82 = fin:true
     rsv1:false
     rsv2:false
     rsv3:false
     opcode:2
2E = masked:false
     payloadLength:46 (decimal)
Payload = UTF8 valid: 
     <snp_info av_pot="11" hands_per_hour="0.20" />

您甚至没有有效负载长度声明与示例缓冲区中剩余的内容不匹配。

在这一点上,明智的做法是查看镀铬检查工具,以了解它认为它得到的框架。 之后的下一步是尝试使用像WireShark这样的工具捕获网络流量,以查看正在发生的事情。

怀疑您在网络上发送的 # 字节与您在 payloadLength 中声明的内容不同。 (我见过的常见方法是发送的字节数比您声明的要多)

例如分配 1024 字节

的缓冲区,正确填写前 48 个,然后发送整个 1024 个字节。 这将弄乱下一帧的解析。

相关内容

  • 没有找到相关文章

最新更新