C - websocket - recv读取超过有效负载长度

时间:2013-03-27 08:07:15

标签: c websocket recv payload

我正在用C构建一个websocket服务器。现在它遵循rfc6455规范,我已经设法实现聊天协议,这样连接的客户端 可以互相发送消息。为了测试我服务器的强度,我运行了一段javascript来测试它是否能够每秒处理来自同一客户端的多条消息:

i = ''; a = 0; t = setInterval('a++; i += "...................................................................................................."; doSend(a + i);', 20);

上面的代码是每20毫秒发送一条消息。此外,发送的消息对于每个消息都大100字节。服务器设法获取消息并在前360次将其发送到连接的客户端,但随后发生了一些奇怪的事情。

对于每个服务器接收消息时,它利用了它的有效载荷长度,这对于消息360将是360 * 100 + 3 = 36003.该值在所述消息的第一部分给定的,所以我们依赖于所述消息实际上是36003字节长。

我使用函数recv从套接字连接接收数据,现在我的缓冲区大小为8192字节。当我收到大于缓冲区大小的消息时,我只需再次调用recv,直到收到整条消息。奇怪的是,当我收到消息号360时,我应该读取缓冲区5次(5 * 8192> 40000)以接收整个消息。而不是我读取的数字5是3235字节(36003-(4 * 8192)),recv函数返回一个完整的缓冲区。 8192个字节。有没有关于发生了什么的线索?

1 个答案:

答案 0 :(得分:0)

@simonc你是完全正确的,当收到消息时,他们会快速合并到recv收到的同一条消息中。因此,如果缓冲区长于预期,我将不得不将从recv接收的消息拆分为多条消息。非常感谢你! :)