gpt4 book ai didi

c# - XNA TCP Socket多次发送丢包

转载 作者:可可西里 更新时间:2023-11-01 02:52:46 27 4
gpt4 key购买 nike

我为 Windows Phone 7 开发了一款不错的免费游戏,名为 Domination,尽管发布时间较早,但还是相当成功!

现在,我正在开发一个在线多人游戏版本,它涉及有趣的功能,现在我已经接近尾声,我遇到了一个大问题。

奇怪的数据包丢失,或类似的事情。

我有一个重现问题的示例。

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

重现问题的步骤:

1) 启动服务器,win form和游戏(你需要一个模拟器和WP7 SDK)

2) 现在,您按下 GO 按钮,表单将打开到服务器的 TCP channel

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

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

嗯,问题是

1) win form 通常收到 50 条消息,很少在一次通信中丢失 10 个数据包,但这种情况很少见

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

我试过其他方法,但没有任何改变..

一个提示,如果我为每次服务器发送设置一个 Thread.Sleep(10),其中 10 是 10 毫秒,它会完美无缺!!

谁能帮帮我?我只是不知道把我的头放在哪里!

示例可以在这里找到:

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

最佳答案

没有消息丢失。他们都被接收了。您的代码只是没有正确解释接收到的数据。如果您查看接收到的字节数,它将是正确的。如果您查看接收到的字节中的数据,它将是正确的。其余的取决于您的代码。

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 newline bar newline)。接收方在收到换行符时就知道它有一条完整的消息。

但是无论您如何定义应用程序级消息,您都必须实际编写代码来完成它。它不会自行发生。

关于c# - XNA TCP Socket多次发送丢包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10634637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com