3

我试图四处寻找一些信息,但找不到任何信息。我正在使用最新版本:21.0.1180.83 m。

我有一个正在使用的 C++ 服务器,握手后我向 Chrome 发送以下内容:“10000001000000100110100001101001”应该只是“嗨”,对吗?但由于某种原因,chrome 什么也没做。我的服务器正在正确发送数据——我在搞乱这些位并且有一个 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;
}
4

2 回答 2

4

看起来你的字节顺序是倒退的。线路上输出的第一个字节是“01101001”,即:

  • 0 - 延续帧
  • 110 - rsvd 1 和 rsvd 2(但不是 rsvd 3)
  • 1001 - ping 操作码。

看来您有一个小端架构,并且正在尝试一次构建具有多个字节的帧/标头,这就是字节序发挥作用的地方。如果您要一次构建具有多个字节的帧,则需要交换值以使用网络字节顺序(即大端序)。

参考:

于 2012-08-30T14:35:03.390 回答
0

如果在握手之后出现任何非帧数据,那么这个“问题”也可能在 Chrome 中出现,然后是帧数据。我只是想分享一下,因为我刚刚调试了这个确切的问题几个小时。我开始的实现是在标题后面的 CRLF \ CRLF 之后添加接受字符串。希望它可以帮助别人:)

于 2014-06-04T00:59:10.387 回答