2013-09-05 24 views
0

我在我現有的服務器中實現了一個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, 

現在一個樣本數據來創建要被髮送看起來像這樣 < < 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,但我不明白爲什麼同樣的消息適用於t他第一次,然後我再次發送相同的消息,它抱怨掩碼位設置。

有人知道爲什麼嗎? 謝謝

回答

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字節。這會弄亂下一幀的解析。

+0

如果Chrome對設置掩碼或特殊位等內容抱怨,那麼這些數據通常不會傳送給網絡檢查員。你可能會想直接跳到WireShark之​​類的東西(我發現Charles已經足夠了,而且使用起來也不那麼複雜)。 –

+0

感謝您的快速回復,並對我遲到的回覆感到抱歉。我已經檢查了wireshark上的流量(鉻不是很有用)。現在我的第一條消息是941字節和第二個251字節。對於第一條消息,我可以在wireshark中看到1個websocket節,但在第二條消息中,我得到3個websocket消息(我將附上截圖)。首先說有效載荷長度2,第二121和第三99.並在信息中說,它的延續信息。 – rameez82

+0

我已經上傳了這裏的圖片 - http://i44.tinypic.com/16hw1nd.png – rameez82