2011-03-08 81 views
0

我正在使用SDL和Net2庫作爲客戶端 - 服務器應用程序。我面臨的問題是,我沒有收到來自我的客戶端的所有TCP數據包,除非在發送每個數據包之前放置一個延遲從客戶端。刪除延遲我只得到一個數據包。SDL Net2缺少TCP數據包

回答

3

TCP連接是一個字節流。您的客戶端可以發送20個每個5個字節的數據包,服務器將其讀取爲100個字節的序列。你需要自己分開數據。

+0

如你所說,它似乎我在一次接受我的所有數據我做到了。 – 2011-03-08 16:19:33

+0

但我不希望發生這種情況,我可以禁用它嗎? – 2011-03-08 16:23:44

+2

這是TCP的工作原理。它不知道邏輯分組,它只是一系列傳輸的字節。 – Erik 2011-03-08 16:26:44

0

那麼你不能保證(在普通插座)在同一時間接收所有數據包,您可能需要調用你的接收功能不止一次,接收所有數據。這當然取決於你對「數據包」的定義,你是否收到你的所有數據?

+1埃裏克

+0

是的,我收到我的所有數據。關於如何申報我的數據包的任何建議?我已經意識到我的數據包非常小,並且TCP在發送它們之前將它們捆綁在一起,而不是每次發送一個數據包。我在開始時使用「密鑰」發送數據包,以便服務器知道如何處理每個數據包,但現在我發現這種情況正在發生,我不知道該怎麼辦。 – 2011-03-08 16:39:43

+0

與您的'鑰匙'一起,您可以簡單地運行收到的數據並檢查您的鑰匙,或者在每個數據包的開頭,您可以發送此消息的準確字節數。很多選項=) – ultifinitus 2011-03-08 18:08:48

0

雖然不能保證是可靠的,您很可能希望使用UDP,TCP沒有。 Net2很好地處理UDP。 UDP實際上非常可靠。 UDP是面向消息的。 UDP消息往往會很快得到發送,並得到路由器的特殊待遇(並不總是一件好事:-)。 UDP通常用於遊戲。

順便說一句,如果你問的SDL郵件列表在這個問題上,或直接發送給我,你會在幾個月前得到了這個建議。

我寫了Net2,然後掛在SDL列表中。我不會在這裏閒逛,因爲這個地方是無限的時間。

鮑勃·彭德爾頓