0

我在 iOS 上使用 Unity3D 运行最新版本的 Raknet 时遇到奇怪的问题:我CONNECTION_ATTEMPT_FAILED在尝试连接到服务器时遇到问题。

现在让我详细说明这个问题:

在 ObjectiveC 应用程序中使用时,完全相同的库连接良好,因此问题似乎与 Unity3D 相关。

我已经设法确定我的问题位于 Raknet 可靠性层:

显然,在连接过程的最后一步(当连接握手完成时),服务器的可靠性层认为 ID_CONNECTION_REQUEST从客户端收到的数据包是确认而不是消息。因此它不回答。最终经过几次尝试(和 10 秒超时),客户端因CONNECTION_ATTEMPT_FAILED错误而失败。

有人有想法吗?当我设法获得更多信息时,我会更新问题。

更新

我们正在使用 Unity3D 5.1.1f1

我们设法找到了解决方法!有关更多信息,请参阅答案。由于解决方法并没有告诉我们太多关于真正发生的事情,我很乐意听到一些 C++/XCode/Unity/iOS/AppleLLVM6.1 专家在这里解释真正发生的事情。

4

1 回答 1

0

问题是 iOS 客户端未正确生成 Raknet 标头。也就是说,我们发送 ACK 消息来代替simple数据包。消息的其余部分被服务器视为垃圾,数据包被丢弃。客户端在超时之前不断尝试发送损坏的握手数据包几次。

这并没有告诉我们为什么,不是吗?显然,在 Unity (iOS) 中运行 Raknet 时没有调用serialize该类的方法。DatagramHeaderFormat其他东西(我不知道是什么)代替了这个方法,并BitStream用损坏的标题填充。

我很确定没有调用 serialize 方法,因为printf来自内部的调用没有显示在控制台中。

我们重命名DatagramHeaderFormat::serializeDatagramHeaderFormat::serializeHeader ...瞧,它起作用了。

现在我只想了解编译器做了什么(以及为什么)。

于 2015-07-23T14:32:06.977 回答