我有一个简单的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)由第一个“fin”设置为1,三个保留位和二进制帧的操作码“0010”组成。我总是将'fin'位设置为1,这意味着它是最终帧,因为我假设WSAsend一次性将缓冲区发送到浏览器。但是,如果WSAsend需要多次调用以发送所有缓冲区呢?如果两个Wsasend调用将要发生,在第一次调用时我应该将fin设置为0(消息的一部分)和第二次调用1(最终帧)?另外我在调用WSasend之前构建了websocket头(我不知道一次或多次),我怎么知道什么时候设置fin位到1或0?
事先感谢您的帮助。
答案 0 :(得分:2)
FIN位与TCP帧无关。它只是表明框架是最后一个Web套接字框架。实际上,有效载荷可能在两个或多个TCP帧中发送,但这对Web套接字协议没有影响 Web套接字实现往往具有最大Web套接字框架大小(不能从握手中派生)。每当帧太大时,您将收到一个错误代码,表明数据太多。但在大多数情况下,Web套接字实现可以处理任何Web套接字框架大小(当然取决于可用内存)。