Я пытаюсь использовать библиотеки 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, но безуспешно.