【问题标题】:embedded bonjour mdnsresponder for android not working (error -65563; daemon not running)用于 android 的嵌入式 bonjour mdnsresponder 无法正常工作(错误 -65563;守护程序未运行)
【发布时间】:2012-11-08 17:34:37
【问题描述】:

由于 jmDNS 不支持子类型的服务浏览,所以我选择交叉编译 bonjour for android,并按照以下步骤操作。

  1. 交叉编译了安卓的 mdnsresponder
  2. 编写了带有 jni 包装器的 dns-sd 客户端,该客户端使用了具有 2 个 jni 函数的上述共享库:
    1. 一个用于调用主循环
    2. 另一个用于浏览服务
  3. 我用 wifi MulticastLock 编写了一个 java 应用程序

但是当我调用 DNSServiceBrowse 时,我得到的错误响应是 DNS service call failed -65563,“后台守护程序未运行”。

通常在 linux 上运行时,我们会启动 mdns 守护进程。

我该如何解决这个问题?有什么建议吗?

【问题讨论】:

    标签: android android-ndk bonjour mdns


    【解决方案1】:

    但是当我调用 DNSServiceBrowse 时,我得到的错误响应是 DNS 服务调用失败 -65563,“后台守护程序未运行”。

    您无法在 Android 中运行守护程序。见:Android daemon process

    为了在嵌入式实现中使用 mdnsresponder,您必须直接与 mDNSCore 通信。请参阅本自述文件的“工作原理”部分,位于 [1]。

    我该如何解决这个问题?

    查看 [2] 中 mDNSEmbedded.h 中的“注意”部分 基本上,您需要使用 [3] 中的 dnssd_clientshim.c,而不是通过守护进程进行通信。这使您可以"still use the preferred dns_sd.h APIs by linking in "dnssd_clientshim.c", which implements the standard "dns_sd.h" API calls, allocates any required storage using malloc(), and then calls through to the low-level malloc-free mDNSCore routines"

    注意:似乎 dnssd_clientshim.c 有一些拼写错误和缺少参考,这将阻止编译,因此您需要在构建时执行补丁(参见 [4] 和 [5])。看来您仍然需要在编译时包含 dnssd_clientlib.c,否则您会在 TXTRecord 函数引用中遇到构建错误。

    [1] [2] [3] [4] [5]

    【讨论】:

      【解决方案2】:

      这意味着当您收到“DNS 服务调用失败 -65563”时,您还没有启动该服务。

      在mdnsresponder包中有一个DNSSDEmbeddedDaemon类,你需要先用这个java类来启动daemon服务,然后调用browse()找到你想要的网络服务。

      顺便说一句,您需要为守护进程获取/释放多播锁。

      这是你可能需要的一段示例代码,这是你在浏览网络服务之前启动的服务。

      public class DNSSDEmbeddedDaemon extends Service {
          private static final String TAG = DNSSDEmbeddedDaemon.class.getName();
      
          public IBinder onBind(Intent paramIntent) {
              return null;
          }
      
          public void onCreate() {
              super.onCreate();
      
              DNSSDEmbedded.listeners.clear();
              DNSSDEmbedded.init(new DNSSDEmbedded.Listener() {
      
                  @Override
                  public void onStart() {
                      Log.d(TAG, "EmbededMDNS onStart");
                  }
      
                  @Override
                  public void onEnd() {
                      Log.d(TAG, "EmbededMDNS onEnd");
                      DNSSDEmbedded.listeners.clear();
                  }
      
                  @Override
                  public void onError() {
                      Log.d(TAG, "EmbededMDNS onError");
                  }
              });
      
          }
      
          public void onDestroy() {
              super.onDestroy();
      
              Log.d(TAG, "EmbededMDNS Exit() is called");
      
              DNSSDEmbedded.Exit();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-16
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多