我正在使用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 事件被调用。
答案 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