我正在使用 Unity3D 开发游戏,并尝试将其部署到 Android 和 iOS 设备。我正在使用 RabbitMQ/AMQP 与服务器通信以进行在线游戏。
当我在 Unity 编辑器和 iOS 设备上运行我的游戏时,所有网络代码都运行良好。但是,当我部署到 Android 设备时,某些与 RabbitMQ 一致的 .NET 库似乎存在问题。
当游戏第一次运行时(并且正在建立与服务器的连接),我的 logcat 中出现以下错误:
E/Unity ( 5378): Connection exception: None of the specified endpoints were reachable
E/Unity ( 5378): Endpoints attempted:
E/Unity ( 5378): ------------------------------------------------
E/Unity ( 5378): endpoint=amqp-0-9://robot.lvl6.com:5672, attempts=1
E/Unity ( 5378): System.EntryPointNotFoundException: getifaddrs
E/Unity ( 5378): at (wrapper managed-to-native) System.Net.NetworkInformation.LinuxNetworkInterface:getifaddrs (intptr&)
E/Unity ( 5378): at System.Net.NetworkInformation.LinuxNetworkInterface.ImplGetAllNetworkInterfaces () [0x00000] in :0
E/Unity ( 5378): at System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces () [0x00000] in :0
E/Unity ( 5378): ================================================
E/Unity ( 5378): Stack trace:
E/Unity ( 5378): at RabbitMQ.Client.ConnectionFactory.CreateConnection (Int32 maxRedirects) [0x00000] in :0
E/Unity ( 5378): at RabbitMQ.Client.ConnectionFactory.CreateConnection () [0x00000] in :0
E/Unity ( 5378): at UMQNetworkManager.Start () [0x0009a]
现在,我已经找到了 this post关于 GetAllNetworkInterfaces() 的问题,但是我很难弄清楚如何从这里前进。
有什么方法可以轻松解决无法通过 Mono 在 Android 上访问 getifaddrs 的问题吗?否则,我现在的选择似乎是 (A) 为我的客户端的 Android 版本使用不同的 AMQP 库,(B) 修改 RabbitMQ 的源代码并以允许我获取它的方式重新编译它在不需要 getifaddrs 的情况下工作,或者 (C) 包含 Java 版本的 RabbitMQ 的 .jar,并使用 Unity 的 AndroidJavaObject 类通过 JNI 访问 RabbitMQ 框架。
我目前正在尝试选项 C,但是我在运行时遇到了一些其他问题,我似乎无法触及...
如果有人对我如何进行此操作有任何建议,将不胜感激。
最佳答案
我们自己解决了这个特殊问题。我们将问题追溯到 RabbitMQ 的 CreateConnectionFactory 调用的源代码。对于稳定分支的rabbitmq客户端v3.2,问题被追踪到位于RabbitMQ.Client程序集的src/client/impl中的SocketFrameHandler_0_9类的构造函数中。导致此崩溃的行是 Socket.OSSupportsIPv6 的属性调用。通过注释特定行并将套接字连接固定为 IPv4,我们设法解决了问题。我们希望这对某人有帮助。
关于c# - 在使用 Mono/Unity3D 的 Android 设备上使用 RabbitMQ 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560488/