Я работаю над библиотекой кроссплатформы Zeroconf / Bonjour / DNS-SD для HASKELL и решил, что моим лучшим ставкам будет нацелиться на dns_sd.h
API. Под Linux реализация этого интерфейса обеспечивается Avahi , что утверждает, что поддерживает подмножество API Bonjour.
Как здравомыслие проверка моей библиотеки, я написал небольшую программу тестирования в C, которая просто использует голые кости API. Он просматривает любой сервис в сети типа _http._tcp
, печатает сообщение, как только оно видит один, а затем умирает:
#include
#include
#include
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, а также Эквивалентный 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
err1=0
err2=0
DNS_SD
Слой совместимости все еще подходящая цель для кроссплатформенной привязки? Или это предупреждающее сообщение достаточно серьезно относится к использованию собственного AVAHI API, который я должен рассмотреть ретаргетинг?