Unity3D + iOS (il2cpp) 上的 Raknet 连接问题

Raknet connection issue on Unity3D + iOS (il2cpp)

我有一个奇怪的问题 运行 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 专家解释真正发生的事情。

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

这并没有告诉我们原因,不是吗?显然 class DatagramHeaderFormatserialize 方法没有被调用,因为它应该在 运行 Raknet in Unity (iOS) 时被调用。链接了其他东西(我不知道是什么)代替此方法,并用损坏的 header.

填充 BitStream

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

我们将 DatagramHeaderFormat::serialize 重命名为 DatagramHeaderFormat::serializeHeader 并且......瞧,它起作用了。

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