встроенный ответ mdnsresponder bonjour для Android не работает (ошибка -65563; демон не запущен)

Поскольку jmDNS не поддерживает просмотр служб по подтипам, я выполнил кросс-компиляцию bonjour для Android и выполнил следующие шаги.

  1. Кросс скомпилировал mdnsresponder для андроида
  2. Wrote dns-sd client with jni wrapper that uses the above shared library that has 2 jni functions:
    1. One for calling the main loop
    2. Другой для просмотра услуг
  3. Я написал java-приложение с Wi-Fi MulticastLock.

Но когда я вызываю DNSServiceBrowse, я получаю ответ об ошибке DNS service call failed -65563, «Фоновый демон не работает».

Обычно при работе в Linux мы запускаем демон mdns.

Как решить эту проблему? Какие-либо предложения?


person indra    schedule 08.11.2012    source источник


Ответы (2)


Но когда я вызываю DNSServiceBrowse, я получаю ответ об ошибке: вызов службы DNS не выполнен -65563, «Фоновый демон не запущен».

Вы не можете запускать демоны в Android. См.: процесс демона Android

Чтобы использовать mdnsresponder во встроенной реализации, вы должны напрямую взаимодействовать с mDNSCore. См. раздел «Как это работает» в этом файле ReadMe в [1].

Как решить эту проблему?

Ознакомьтесь с разделом «Примечание» в mDNSEmbedded.h в [2]. По сути, вместо того, чтобы общаться через демон, вам нужно использовать dnssd_clientshim.c в [3]. Это позволяет вам "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]

person BigMacAttack    schedule 31.01.2013

это означает, что вы еще не запускаете службу, когда получаете сообщение «Ошибка вызова службы DNS -65563».

в пакете mdnsresponder есть класс DNSSDEmbeddedDaemon, вам нужно использовать этот класс Java, чтобы сначала запустить службу демона, а затем вы можете вызвать метод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();
    }
}
person Zephyr    schedule 08.05.2014