2012-05-17 30 views
1

我爲Windows Phone 7開發了一款不錯的免費遊戲,稱爲Domination,儘管早期發佈,它也相當成功!XNA TCP Socket多發包丟失

現在,我正在開發一個在線多人遊戲版本,它將有趣的功能,現在我已經接近尾聲,我遇到了一個大問題。

WEIRD丟包,或類似的東西。

我有一個重現問題的例子。

我有一臺服務器。 我一個雙贏的窗體的客戶 我有一個XNA客戶

步驟來重現問題:

1)啓動服務器,贏形式和遊戲(你需要一個仿真器和WP7 SDK )

2)現在,按下GO按鈕,形式將打開TCP信道到服務器

3)現在,按上仿真器的屏幕,並且形式將打開TCP信道服務器

4)現在,每次按屏幕模擬器,或贏窗體上的GO按鈕時,服務器會送你回50封郵件正確客戶端上

很好,問題是,

1)贏得形式通常收到50條消息,RARELY在一次通信中丟失了10個數據包,但是它很少使用,但它很容易丟失30-40-45條消息!!!!!

我試過其他的方法,但沒有任何改變..

一個提示,如果我把一個Thread.sleep代碼(10),10是10毫秒,每個服務器發送,它的作品完美!

任何人都可以幫助我嗎?我只是不知道該把我的頭放在哪裏!

樣品可以在這裏找到:

http://uploading.com/files/d7e7939c/Projects.zip/

+0

您正在使數據包與應用程序級消息和字節塊混淆。如果你保持這些概念清晰明瞭,理解發生的事情會容易得多。事實上,你並沒有失去這三件事。 –

回答

1

沒有郵件丟失。他們都被接收。你的代碼只是沒有正確解釋接收到的數據。如果您查看字節收到的數量,它將是正確的。如果您查看收到的字節中的數據,它將是正確的。其餘的由您的代碼決定。

TCP提供了一個字節流服務。這意味着你得到你發送的相同字節。如果您需要將這些字節「粘合」成消息,那麼您必須編寫代碼來執行此操作。如果你發送 30個字節,你可能會收到30個字節,或者10個字節,然後是20個字節,或者1個字節30次,或者中間的任何東西。如果發送5個字節,然後發送3個字節,則可能會收到5個字節,然後是3個字節。或者你可能會收到8個字節。或者你可能會收到8個字節的1個字節。

必須定義消息格式。必須編碼發件人以該格式發送郵件。 必須對接收器進行編碼以確定它何時收到完整的消息。

發生了什麼事是你發送「FOO」,然後「BAR」,並收到「FOOBAR」。除了「FOO」和「BAR」之間的界限之外,這個過程中沒有任何東西丟失。但是,TCP沒有消息邊界的概念。如果你需要他們,你必須編碼。例如,您可以發送「3FOO3BAR」。現在,無論如何收到,接收者都知道「FOO」是一條消息,「BAR」是另一條消息。另一種選擇是「foo \ nbar \ n」(foo newline bar換行符)。接收者在收到換行符時知道它有一個完整的消息。

但是,無論您如何定義應用程序級別的消息,您實際上都必須編寫代碼來執行此操作。它不會自行發生。

+0

你是對的,我忘了在樣品上做它,但我的遊戲有這種分隔符,讓我更新樣品,將花費10分鐘 –

+0

好吧,我發現問題,我是個白癡。 ..我的分隔符目前的工作和正確地拆分消息,真正的問題是,我保存下一個COMPLETED異步接收的緩衝區的其餘部分,如果我沒有收到,這個緩衝區會丟失!多麼愚蠢......我知道這不是丟包的問題,​​但是關於異步的一些事我做錯了。 –