Websocket - Chrome抱怨掩码位设置

时间:2013-09-05 16:19:13

标签: erlang websocket

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

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,

现在要传输的一个样本数据如下所示     &LT;&LT; 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&GT;&GT;

正如你在上面的代码中看到的,我的掩码位总是设置为0,但我不是为什么第一次使用相同的消息然后我再次发送相同的消息,它抱怨掩码位设置。

有人知道为什么吗? 感谢

1 个答案:

答案 0 :(得分: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字节。这将破坏下一帧的解析。