gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:43:57 28 4
gpt4 key购买 nike

我正在使用 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 协议(protocol),也许问题出在我的代码中。提前致谢!

编辑

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

最佳答案

您的数据看起来不错,第一个字节(12 月为 -127,或 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

关于c++ - WebSocket,解码数据帧(c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com