Фон
Я работаю над кроссплатформенной библиотекой 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
Вопросы
- Является ли уровень совместимости Avahi
dns_sd
подходящей целью для кроссплатформенного связывания?Или это предупреждающее сообщение достаточно серьезное об использовании нативного API Avahi, которое я должен рассмотреть для ретаргетинга? - Каково состояние кроссплатформенного Zeroconf в C?