Слой совместимости Avahi dns_sd не запускается - PullRequest
5 голосов
/ 12 сентября 2011

Фон

Я работаю над кроссплатформенной библиотекой Zeroconf / Bonjour / DNS-SD для Haskell и решил, что моя лучшая ставка была бы нацелена на dns_sd.h API.В Linux реализация этого интерфейса обеспечивается Avahi , который утверждает, что поддерживает подмножество Bonjour API.

Проблема

В качестве проверки работоспособности для моей библиотекиЯ написал небольшую тестовую программу на C, которая просто использует API.Он просматривает любой сервис в сети типа _http._tcp, печатает сообщение, как только оно его видит, а затем умирает:

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

void cb(DNSServiceRef sdRef,
        DNSServiceFlags flags,
        uint32_t interfaceIndex,
        DNSServiceErrorType errorCode,
        const char *serviceName,
        const char *regtype,
        const char *replyDomain,
        void *context) {
  printf("called!\n");
}

int main() {
  DNSServiceRef sd = malloc(sizeof(DNSServiceRef));
  const char *regtype = "_http._tcp";
  DNSServiceErrorType err1 = DNSServiceBrowse(&sd, 0, 0, regtype, NULL, &cb, NULL);
  printf("err1=%d\n", err1);
  DNSServiceErrorType err2 = DNSServiceProcessResult(sd);
  printf("err2=%d\n", err2);
  return 0;
}

На моем Mac эта тестовая программа прекрасно работает как на C, так и на C.эквивалентный Haskell (он находит мой принтер; захватывающий!):

$ gcc test.c -o test
$ ./test
err1=0
called!
err2=0

Но на моем Linux-компьютере программа ругает меня перед выходом без вызова обратного вызова:

$ gcc test.c -o test -ldns_sd
$ ./test
*** WARNING *** The program 'test' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=test>
err1=0
err2=0

Вопросы

  1. Является ли уровень совместимости Avahi dns_sd подходящей целью для кроссплатформенного связывания?Или это предупреждающее сообщение достаточно серьезное об использовании нативного API Avahi, которое я должен рассмотреть для ретаргетинга?
  2. Каково состояние кроссплатформенного Zeroconf в C?

1 Ответ

4 голосов
/ 05 октября 2011

По неизвестной мне причине работает только с неблокирующими вызовами.Ниже приведен улучшенный код.Сокет от Avahi установлен в неблокирующий режим, а затем select (3) используется для ожидания доступных данных.DNSServiceProcessResult(sd) необходимо вызывать каждый раз, когда в сокете появляются данные, поэтому ваш пример работал на других платформах.

...