gpt4 book ai didi

c++ - 构建 websocket 头,向浏览器发送数据时

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:34 26 4
gpt4 key购买 nike

我有一个简单的 iocp 服务器,它需要通过 websocket 向浏览器发送 1024(或更多)字节。根据这个关于 websocket 的 RFC:

  +-+-+-+-+-------+-+-------------+-------------------------------+
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 ... |
+---------------------------------------------------------------+

我以这种方式构建 websocket 头:

   char BufferToSend[1028]; //+4 bytes for websocket head

BufferToSend[0]=130; // 10000010
BufferToSend[1]=126; // 01111110 first bit 0 means unmask message
BufferToSend[2] = // 2 bytes for payload size
BufferToSend[3] = //
BufferToSend[4] = // payload starts
.....
// sending data to browser
WSASend(Socket, &wsabuf,1,&dwSendNumBytes..); //wsabuf refers to BufferToSend

第一个字节 (10000010) 由设置为 1 的第一位“fin”、三个保留位和二进制帧的操作码“0010”组成。我总是将“fin”位设置为 1,这意味着它是最后一帧,因为我假设 WSAsend 一次将缓冲区一次性发送到浏览器。但是,如果需要多次调用 WSAsend 来发送所有缓冲区怎么办?如果要进行两次 Wsasend 调用,我应该在第一次调用中将 fin 设置为 0(消息的一部分)并在第二次调用中设置为 1(最终帧)吗?此外,我在调用 WSasend 之前构建了 websocket 头(我不知道一次或多次),我怎么知道什么时候将 fin 位设置为 1 或 0?

在此先感谢您的帮助。

最佳答案

FIN 位与 TCP 帧无关。它只是表明该框架是最后一个网络套接字框架。实际上,有效负载可能在两个或多个 TCP 帧中发送,但这对 Web 套接字协议(protocol)没有影响。
Web 套接字实现往往具有最大 Web 套接字帧大小(不能从握手中得出)。每当帧太大时,您将收到一个错误代码,指示数据过多。但在大多数情况下,网络套接字实现可以处理任何网络套接字帧大小(当然取决于可用内存)。

关于c++ - 构建 websocket 头,向浏览器发送数据时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22276572/

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