2012-08-30 36 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之后添加接受字符串。希望它可以帮助别人:)