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

时间:2014-02-04 18:30:11

标签: c# android mono unity3d rabbitmq

我正在使用Unity3D开发游戏,并尝试将其部署到Android和iOS设备。我正在使用RabbitMQ / AMQP与服务器进行在线播放。

当我在Unity编辑器和iOS设备上运行游戏时,所有网络代码都能正常运行。但是,当我部署到Android设备时,似乎存在一些与RabbitMQ达成一致的.NET库的问题。

当游戏首次运行(并且正在建立与服务器的连接)时,我的logcat中出现以下错误:

  

E / Unity(5378):连接异常:没有指定的端点可到达
  E / Unity(5378):尝试终点:
  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(包装器托管到原生)System.Net.NetworkInformation.LinuxNetworkInterface:getifaddrs(intptr&)
  E / Unity(5378):在System.Net.NetworkInformation.LinuxNetworkInterface.ImplGetAllNetworkInterfaces()[0x00000] in:0
  E / Unity(5378):在System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()[0x00000] in:0
  E / Unity(5378):=========================================== =====
  E / Unity(5378):堆栈跟踪:
  E / Unity(5378):在RabbitMQ.Client.ConnectionFactory.CreateConnection(Int32 maxRedirects)[0x00000] in:0
  E / Unity(5378):在RabbitMQ.Client.ConnectionFactory.CreateConnection()[0x00000]中:0
  E / Unity(5378):在UMQNetworkManager.Start()[0x0009a]

现在,我已经能够找到关于GetAllNetworkInterfaces()问题的this post,但是我很难弄清楚如何从这里前进。

有没有办法轻松解决不能通过Mono在Android上访问的getifaddrs?否则,我现在的选择似乎是(A)为我的客户端的Android版本使用不同的AMQP库,(B)修改RabbitMQ的源代码并以允许我获取它的方式重新编译它在不需要getifaddrs的情况下工作,或者(C)包含用于Java版RabbitMQ的.jar,并使用Unity的AndroidJavaObject类通过JNI访问RabbitMQ框架。

我目前正在尝试使用选项C,但是我在运行时遇到了其他一些问题,我似乎无法指责...

如果有人对我如何处理此事有任何建议,将非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

我们自己正在解决这个问题。我们将问题追溯到RabbitMQ的CreateConnectionFactory调用的源代码。对于stable分支的rabbitmq客户端的v3.2,问题可以追溯到位于RabbitMQ.Client程序集的src / client / impl中的SocketFrameHandler_0_9类的构造函数中。导致此崩溃的行是Socket.OSSupportsIPv6的属性调用。通过注释特定的行并将套接字连接修复为IPv4,我们设法解决了这个问题。我们希望这有助于某人。