dns_sd DNSServiceBrowse () завершается с ошибкой -65563: фоновый демон не работает - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь использовать библиотеки dns_sd и Apple Bonjour в межплатформенном приложении C (Linux / Windows), чтобы найти другие экземпляры приложения в сети. Хотя он отлично работает на Linux с Avahi и avahi-compat-libdns_sd, я не могу запустить его на Windows с Bonjour. К сожалению, приложение Windows ограничено 32-битным набором инструментов mingw32 (gcc 4.9.2).

Он компилируется и связывается без ошибок, но каждый вызов dnssd-API завершается ошибкой с кодом ошибки -65563 Фоновый демон не работает .

Демон Bonjour работает (я дважды проверил службы Windows и процесс mDNSResponder.exe), и даже dns-sd.exe в командной строке работает нормально. Я использую Windows 7 x64 и Bonjour / Bonjour SDK 3.0.0.10.

Вот минимальный нерабочий пример программы:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include "dns_sd.h"
#include <windows.h>

static DNSSD_API void DNSServiceBrowseCallback(
    DNSServiceRef                       sdRef,
    DNSServiceFlags                     flags,
    uint32_t                            interfaceIndex,
    DNSServiceErrorType                 errorCode,
    const char                          *serviceName,
    const char                          *regtype,
    const char                          *replyDomain,
    void                                *context)
{
    printf("%s service %s.%s%s    (error code %i)\n",
            (flags & kDNSServiceFlagsAdd) ? "new" : "vanished",
            serviceName,
            regtype,
            replyDomain,
            errorCode);
}


int main( int argc, char** argv ) {
    DNSServiceRef sdRef = NULL;
    DNSServiceErrorType res = DNSServiceBrowse(&sdRef, 0, 0, "_ipp._tcp", NULL,
            &DNSServiceBrowseCallback, sdRef);
    if (res != kDNSServiceErr_NoError) {
        printf("Could not start network discovery: Errorcode %i\n", res);
        return 1;
    }

    // Enter loop to receive results
    // [...]

    return 0;
}

Компиляция с помощью

gcc.exe -g -Wall -std=c99 -DWINVER=0x0501 dnssd-test.c -ldnssd -o dnssd-test.exe

вызывает предупреждение компоновщика Предупреждение: поврежден .drectve в конце файла def , но создает допустимый исполняемый файл. Его выполнение приводит к приведенному выше коду ошибки ( Не удалось запустить обнаружение сети: код ошибки -65563 ) и не инициализирует sdRef, поэтому, несмотря на то, что серверы объявляются в сети, функция обратного вызова никогда не выполняется называется.

Я уже пробовал старые версии Bonjour и Bonjour SDK, но безуспешно.

...