我在使用Unity3D在iOS上运行最新版本的Raknet时遇到了奇怪的问题:尝试连接服务器时我得到CONNECTION_ATTEMPT_FAILED
。
现在让我详细说明问题:
他在ObjectiveC应用程序中使用时完全相同的库连接,因此问题似乎与Unity3D相关。
我已经设法确定我的问题位于Raknet可靠性层:
显然,在连接过程的最后一步(当连接握手已完成时),服务器的可靠性层认为从客户端接收的ID_CONNECTION_REQUEST
数据包是确认而不是消息。因此它没有回答。经过几次尝试(以及10秒超时)后,客户端失败并出现CONNECTION_ATTEMPT_FAILED
错误。
有人在那里作为一个想法吗?当我设法获得更多信息时,我会更新问题。
我们正在使用Unity3D 5.1.1f1
我们设法找到了解决方法!有关更多信息,请参阅答案由于解决方法并没有告诉我们真正发生的事情,我很乐意听到一些C ++ / XCode / Unity / iOS / AppleLLVM6.1专家在这里解释究竟发生了什么。
答案 0 :(得分:0)
问题是iOS客户端没有正确生成Raknet标头。即我们发送ACK消息代替simple
数据包。消息的其余部分被服务器视为垃圾,数据包被丢弃。在计时之前,客户端一直试图发送损坏的握手包几次。
这并没有告诉我们原因,不是吗?显然,类serialize
的{{1}}方法没有被调用,因为在Unity(iOS)中运行Raknet时应该这样做。其他东西(我也不知道是什么)被链接到了这个方法的位置,并且用DatagramHeaderFormat
填充了一个损坏的标题。
我很确定序列化方法没有被调用,因为来自内部的BitStream
调用没有在控制台中显示。
我们将printf
重命名为DatagramHeaderFormat::serialize
并且......瞧,它有效。
现在我只想了解编译器的内容(以及原因)。