0

我正在用 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)才能接收到整个消息。recv 函数返回一个完整的缓冲区,而不是我的读取数 5 是 3235 字节(36003-(4*8192))。8192 字节。有没有人知道发生了什么?

4

1 回答 1

0

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

于 2013-03-29T19:17:42.703 回答