构建websocket头,在向浏览器发送数据时

时间:2014-03-08 23:44:33

标签: c++ websocket

我有一个简单的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?

事先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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