【发布时间】:2013-03-17 06:12:42
【问题描述】:
我正在用 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 字节。有没有人知道发生了什么?
【问题讨论】:
-
您可能会收到以下客户端消息的开头。
-
除了@simonc,我建议您检查消息长度(在第一个数据部分中)并读取不超过该值。在这种情况下,下一条消息不会损坏。
-
除了@Eddy_Em,我建议提高javascript计时器以进行测试,并观察在下一条消息到达您的服务器之前是否可以完全接收36003字节消息