私はbonjourサービスを通じて2つのiOSアプリ間の通信を実装しようとしています。これはおそらく、App-Storeのレビューでは受け入れられないとは言いません。とにかく店には掲載されません。DNSServiceをループバックインターフェイスに制限する方法はありますか?
サービスのループバックインターフェイスへのBonjourアナウンスを、同じデバイス上の接続のみを許可するように制限しようとしています。次のように私は発見を実施してきたクライアント側で
DNSServiceErrorType err = DNSServiceRegister(
&dnsServiceRef,
kDNSServiceFlagsDefault,
if_nametoindex("lo0"), //limit to loopback interface
"myServiceName",
"_myservicetype._tcp",
NULL,
NULL,
htons(port),
0,
NULL,
&DNSServiceRegisterCallback,
(__bridge void *)(self)
);
:
DNSServiceErrorType error = DNSServiceBrowse(&serviceBrowseRef,
kDNSServiceFlagsDefault,
if_nametoindex("lo0"), //limit discovery to loopback as well
"_myservicetype._tcp",
NULL,
&serviceBrowseReply,
(__bridge void *)(self)
);
テストをして
は、私は次の方法でサービスを発表する低レベルDNSServiceRegisterメソッドを実装しましたiPhoneシミュレータは期待される結果を返しません。この発見により、発表されたサービスは見つかりません。
いくつかの更なる掘削:
はそれがdns-sd -B _myservicetype._tcp
を働いていた場合、コマンドラインでチェックしようとしているが、それは何も
は、不思議なことに、次のdns-sd -lo -B _myservicetype._tcp
(代わりに、ループバックのすべてのローカルインターフェイスには限界が)期待されるサービスを示していない検出されたが、 interfaceIndexは0です(しかしif_nametoindexはインデックスが1であると言う)DNSServiceBrowse
のパラメータとしてif_nametoindex("lo0")
の代わりにkDNSServiceInterfaceIndexLocalOnly
の代わりにkDNSServiceInterfaceIndexLocalOnly
を使用すると、アナウンスされたサービスが返されます。 コールバックで報告されたinterfaceIndexは再び0です(コマンドラインツールと同じ動作)。
とにも見知らぬ人
は、この予想される動作(インターフェイスをループバックするために制限することは許されない?)または午前私はサービスの登録中kDNSServiceInterfaceIndexLocalOnly
を使用する場合は、発見されたサービスのInterfaceIndexのは4294967295(UINTオーバーフロー?)であります私はここでインターフェイスインデックスの内部処理に関するいくつかの奇妙なバグを経験していますか?
:宣伝とローカルサービスだけを参照する方法についてのガイダンスに従ってください。 ループバックインターフェイスを介した接続のみを許可するソケットに接続できるようにするには、後で解決されたホスト名を削除して、代わりに 'localhost'を使用します – JanR