解码 websocket 框架
我正在尝试解码 websocket 帧,但在解码扩展有效负载时没有成功。到目前为止我所取得的成就是:
char *in = data;
char *buffer;
unsigned int i;
unsigned char mask[4];
unsigned int packet_length = 0;
int rc;
/* Expect a finished text frame. */
assert(in[0] == '\x81');
packet_length = ((unsigned char) in[1]) & 0x7f;
mask[0] = in[2];
mask[1] = in[3];
mask[2] = in[4];
mask[3] = in[5];
if (packet_length <= 125) { **// This decoding works**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[6 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 6);
} else
if (packet_length == 126) { **//This decosing does NOT work**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[8 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 8);
}
我做错了什么?如何对扩展有效负载进行编码?
I am trying to decode a websocket frame, but I'm not successful when it comes to decoding the extended payload. Here what I did achieve so far:
char *in = data;
char *buffer;
unsigned int i;
unsigned char mask[4];
unsigned int packet_length = 0;
int rc;
/* Expect a finished text frame. */
assert(in[0] == '\x81');
packet_length = ((unsigned char) in[1]) & 0x7f;
mask[0] = in[2];
mask[1] = in[3];
mask[2] = in[4];
mask[3] = in[5];
if (packet_length <= 125) { **// This decoding works**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[6 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 6);
} else
if (packet_length == 126) { **//This decosing does NOT work**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[8 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 8);
}
What am I doing wrong? How do I encode the extended payload?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
症结点在于>。 125 字节有效负载。
格式非常简单,假设您在 JavaScript 中发送十个 a:
然后服务器将收到:
但现在假设您发送 126 个 a在JavaScript中:
那么服务器将收到:
如果有效负载的长度> 125,字节 1 的值为 0xfe,格式随后更改为:
C# 中的示例代码:
The sticking point is at > 125 bytes payload.
The format is pretty simple, lets say you send ten a's in JavaScript:
Then the server will receive:
But now lets say you send 126 a's in JavaScript:
Then the server will receive:
If the length of the payload is > 125, the byte 1 will have the value 0xfe, the format changes then to:
Example code in C#:
如果packet_length为126,则接下来的2个字节给出要读取的数据的长度。
如果packet_length为127,则接下来的8个字节给出了要读取的数据的长度。
掩码包含在以下 4 个字节中(长度之后)。
要解码的消息如下。
数据框架部分规范对此有一个有用的说明。
如果您将代码重新排序为
那么事情就应该可以了。
If packet_length is 126, the following 2 bytes give the length of data to be read.
If packet_length is 127, the following 8 bytes give the length of data to be read.
The mask is contained in the following 4 bytes (after the length).
The message to be decoded follows this.
The data framing section of the spec has a useful illustration of this.
If you re-order your code to something like
then things should work.