【问题标题】:C - websocket - recv reads more than payload lengthC - websocket - recv 读取超过有效负载长度
【发布时间】: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字节消息

标签: c websocket recv payload


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2020-07-05
    • 2013-11-08
    • 1970-01-01
    • 2019-10-26
    • 2019-06-22
    • 2014-09-23
    相关资源
    最近更新 更多