2013-03-27 62 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收到的消息分成多個消息。非常感謝你! :)