2013-03-27 33 views
0

我正在C中构建一个websocket服务器。现在它遵循rfc6455规范,我设法实现了一个聊天协议,以便连接的客户端 可以相互发送消息。为了测试我的服务器的力量,我跑了一段JavaScript代码来测试它是否可以每秒钟从同一个客户端处理几个消息:C - websocket - recv读取的数据不止有效载荷长度

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函数返回一个完整的缓冲区aka。 8192字节。有没有人知道发生了什么?

+2

您可能会收到以下客户端消息的开头。 – simonc 2013-03-27 08:12:17

+0

除了@simonc,我建议您检查消息长度(在第一个数据部分)并读取不超过该值。在这种情况下,下一条消息不会被破坏。 – 2013-03-27 08:15:21

+0

除了@Eddy_Em我建议为了测试目的而引发javascript定时器,并观察在下一条消息到达服务器之前是否可以完全接收到36003字节消息 – 2013-03-27 08:29:12

回答

0

@simonc你是完全正确的,当收到消息时他们很快将它们合并成recv收到的相同消息。所以如果缓冲区比预期的长,我必须将从recv收到的消息分成多个消息。非常感谢你! :)