2012-08-30 70 views
3

我試圖找尋一些信息,但找不到任何。我正在使用最新版本:21.0.1180.83米。WebSocket Chrome接收數據問題

我有一個C++服務器我工作,握手後,我發送Chrome以下內容:「10000001000000100110100001101001」這應該只是「嗨」,是否正確?但由於某些原因,Chrome並沒有做任何事情。我的服務器正在正確發送數據 - 我在亂搞這些位,並有一個錯誤消息說:一個或多個保留位打開:reserved2 = 1,reserved3 = 1.所以,我知道chrome接收正確。

ws.onmessage = function (evt) 
    { 
     var received_msg = evt.data; 
     alert(received_msg); 
    }; 

據我所知,應該是正確的,除非我失去了一些東西......任何幫助將不勝感激。

編輯我解決我的問題,好像我沒有正確地把字節一起...

下面是一段代碼我一起斬來解決......(不恨)

string construct_data (string data) { 
    string return_value = ""; 
/* 0     1     2     3 
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-------+-+-------------+-------------------------------+ 
    |F|R|R|R| opcode|M| Payload len | Extended payload length | 
    |I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
    |N|V|V|V|  |S|    | (if payload len==126/127) | 
    | |1|2|3|  |K|    |        | 
    +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
    |  Extended payload length continued, if payload len == 127 | 
    + - - - - - - - - - - - - - - - +-------------------------------+ 
    |        |Masking-key, if MASK set to 1 | 
    +-------------------------------+-------------------------------+ 
    | Masking-key (continued)  |   Payload Data   | 
    +-------------------------------- - - - - - - - - - - - - - - - + 
    :      Payload Data continued ...    : 
    + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
    |      Payload Data continued ...    | 
    +---------------------------------------------------------------+*/ 
    char unmasked = 129; 
    char size; 

    if (data.size() <= 125) { 
     size = data.size(); 
    } else if (data.size() > 125 && data.size() <= 65535) { 
     size = 126; 
    } else if (data.size() > 65535) { 
     size = 127; 
    } 

    stringstream it_um; 
    stringstream it_s; 
    for (int i = 0; i < 1 ; i++) 
     it_um << unmasked; 
    for (int i = 0; i < 1; i++) 
     it_s << size; 

    std::string raw_unmask; 
    std::string raw_size; 

    raw_unmask = it_um.str(); 
    raw_size = it_s.str(); 

    string raw_data = raw_unmask + raw_size + data; 

    return_value.append(raw_data); 

    return return_value; 
} 
+0

在發送消息後,是否發生onerror或onclose回調?你能發佈你的消息發送代碼嗎?握手代碼也可能是有用的(以防在握手結束時有額外的數據被Chrome解釋爲消息的開始)。使用wireshark檢查您是否真的發送了您期望的數據,這可能也很有趣。 – simonc

+0

@simonc不能,一切都很好。生病檢查電線鯊魚。我很確定它與kanaka建議的一樣。 – User

+0

@Ohmages:你能告訴我你的解決方案嗎?你是如何解決它的?我也面臨類似的問題。任何幫助將不勝感激。 –

回答

4

它看起來像你的字節順序是倒退。即外出電線上的第一個字節是 「01101001」,它是:

  • 0 - 延續幀
  • 110 - RSVD 1和RSVD 2(但不RSVD 3)
  • 1001 - 平操作碼。

看起來你有一個little endian體系結構,並且試圖在一個endianness發揮作用的時候用多個字節構造frame/header。如果要一次構建多個字節的幀,則需要交換這些值以使用網絡字節順序(即大端)。

參考文獻:

+0

我仍然無法使它工作。即使修改了常量字符串值。 – User

+0

我也只是有一個想法,握手代碼的作品,鉻說握手成功,所以我不知道爲什麼發送其他數據是任何不同的...因爲我以同樣的方式構建握手,只是將字符串放在一起。 – User

+0

嘿,我解決了它,感謝你:-) – User

0

這個 「問題」 也能體現在Chrome中,如果任何非成幀數據來握手,然後接着構造的數據之後。我只是想分享一下,因爲我剛剛調試了幾個小時這個確切的問題。我開始的實現是在頭部之後的CRLF \ CRLF之後添加接受字符串。希望它可以幫助別人:)