バックグラウンド
dns_sd.h
Haskell 用のクロスプラットフォーム Zeroconf/Bonjour/DNS-SD ライブラリに取り組んでおり、 APIをターゲットにすることが最善の策だと考えました。Linux では、このインターフェースの実装は、Bonjour API のサブセットをサポートすると主張するAvahiによって提供されます。
問題
ライブラリのサニティ チェックとして、API の必要最小限を使用するだけの小さなテスト プログラムを C で作成しました。タイプ のネットワーク上の任意のサービスをブラウズし_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 と同等の 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
互換性レイヤーは、依然としてクロスプラットフォーム バインディングの適切なターゲットですか? それとも、ネイティブの Avahi API を使用することについて、その警告メッセージは深刻なので、リターゲットを検討する必要がありますか? - C でのクロスプラットフォーム Zeroconf の最新技術は何ですか?