c# - 在使用 Mono/Unity3D 的 Android 设备上使用 RabbitMQ 的问题

标签 c# android mono unity3d rabbitmq

我正在使用 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/

相关文章:

c# - 如何使用 C# 运行包含许多关键字(包括 "GO")的大型 SQL 脚本?

macos - 在 mono 上使用 Profiler 收集代码覆盖率信息不包括测试的 dll 的程序集

.net - 如果垃圾收集器在 Monotouch 4 中为 "more aggressive",这意味着什么?

android - Unity 中的 native Android 库抛出 DllNotFound 异常

android - ADB ant debug 安装在多个安卓设备上

c# - 设计器无法显示 XAML(类型“本地 :. .. 未找到”)

c# - 如何在 ASP.Net Core Razor 页面上重定向

c# - 索引不适用于 Raven DB,如何调试?

java - 多个 OnClick 事件不适用于所有对象

android - 如何更改android中星星侧面 View 的颜色?