WebSocket,解码数据帧(c ++)

时间:2017-08-31 22:36:21

标签: c++ websocket server

我正在使用winsock2在websocket服务器上(使用c ++)。现在,我正在回应客户端的初始握手(在我的情况下是Chrome),然后我从客户端发送数据:

socket.send("Hello!");

我正在尝试解码数据框,但我遇到了一些问题。让我们来看看代码:

int GetBit(const char * data, unsigned int idx)
{
    unsigned int arIdx = idx / 4;
    unsigned int biIdx = idx % 4;
    return (data[arIdx] >> biIdx) & 1;
}

void ParseDataFrame(const char * packet)
{
    int FIN  = GetBit(packet, 0);
    unsigned char OPC = 0;
    {
        int opc0 = GetBit(packet, 4);
        int opc1 = GetBit(packet, 5);
        int opc2 = GetBit(packet, 6);
        int opc3 = GetBit(packet, 7);
        OPC |= (opc0 << 0);
        OPC |= (opc1 << 1);
        OPC |= (opc2 << 2);
        OPC |= (opc3 << 3);
    }  
    int MASK = GetBit(packet, 5);
}
我得到了:

FIN = 1 
OPC = x6 (can´t be) 
MAKS = 0 (can´t be)

我一直在阅读WS协议,可能问题出现在我的代码中。 提前谢谢!

修改

我想提一下,连接已正确建立,因为控制台(chrome)中没有错误,并且 socket.onopen 事件被调用。

1 个答案:

答案 0 :(得分:2)

您的数据看起来没问题,第一个字节(-127 in dec,或0x81或1000 0001)。

使用GetBit读取时,每个字节使用4位而不是8位。

biIdx目前从最右边的位开始到最左边的位。这应该是另一种方式:

int GetBit(const char * data, unsigned int idx)
{
    unsigned int arIdx = idx / 8;
    unsigned int biIdx = idx % 8;
    return (data[arIdx] >> (7 - biIdx)) & 1;
}

那应该能找到正确的位。

对于MASK,您应该阅读第8位。如指定:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers