XNA TCP Socket多次发送丢包

时间:2012-05-17 11:12:36

标签: c# windows-phone-7 tcp xna

我为Windows Phone 7开发了一个不错的免费游戏,称为Domination,尽管早期发布,它仍然取得了相当大的成功!

现在,我正在开发一个关注有趣功能的在线多人游戏版本,现在我几乎已经到了最后,我遇到了一个很大的问题。

WEIRD数据包丢失,或类似的东西。

我有一个重现问题的样本。

我有一台服务器。 我有一个Win Form Client 我有一个XNA客户端

重现问题的步骤:

1)你启动服务器,获胜形式和游戏(你需要一个模拟器和WP7 SDK)

2)现在,按GO按钮,表单将打开TCP通道到服务器

3)现在,您按下模拟器上的屏幕,表单将打开TCP通道到服务器

4)现在,每次按下屏幕模拟器或win表格上的GO按钮,服务器都会在适当的客户端上发回50条消息

嗯,问题在于

1)win表单通常会收到50条消息,RARELY在一次通信中丢失10个数据包,但它很罕见

2)模拟器,总是丢失30-40-45条消息!!!!!

我尝试了其他方法,但没有改变......

一个提示,如果我把一个Thread.Sleep(10),其中10是10毫秒,对于每个服务器发送,它的工作完美!!

有人能帮帮我吗?我只是不知道该放在哪里!

样品可以在这里找到:

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

1 个答案:

答案 0 :(得分:1)

没有消息丢失。他们都被收到了。您的代码无法正确解释收到的数据。如果你看一下收到的 bytes 的数量,它就是正确的。如果查看收到的字节数据,它将是正确的。其余的由您的代码决定。

TCP提供字节流服务。这意味着你得到你发送的相同字节。如果您需要将这些字节“粘合”到消息中,那么您必须编写代码来执行此操作。如果发送 30个字节,则可能会收到30个字节,或10个字节,然后是20个字节,或1个字节30次,或者介于两者之间。如果发送5个字节然后发送3个字节,则可能会收到5个字节,然后是3个字节。或者您可能会收到8个字节。或者你可能会收到1个字节8次。

必须定义消息格式。 必须对发件人进行编码,以便以该格式发送邮件。 必须对接收方进行编码,以确定何时收到完整的消息。

发生的事情是您发送“FOO”然后发送“BAR”并接收“FOOBAR”。除了“FOO”和“BAR”之间的边界外,在此过程中没有任何损失。但是,TCP没有消息边界的概念。如果您需要它们,则必须对它们进行编码。例如,您可以发送“3FOO3BAR”。现在,无论如何接收,接收者都知道“FOO”是一条消息而“BAR”是另一条消息。另一个选择是“foo \ nbar \ n”(foo换行栏换行)。接收方在收到换行符时知道它有完整的消息。

但是,无论您定义应用程序级别的消息,都必须实际编写代码来执行此操作。它本身不会发生。