Ich versuche die Kommunikation zwischen zwei iOS-Apps durch einen Bonjour-Service zu implementieren. Lassen Sie uns nicht diskutieren, dass dies wahrscheinlich nicht von der App-Store-Rezension akzeptiert wird. Es wird sowieso nicht im Laden veröffentlicht.Wie kann DNSService auf die Loopback-Schnittstelle beschränkt werden?
Ich versuche eine Bonjour-Ankündigung für den Dienst auf die Loopback-Schnittstelle zu beschränken, um nur Verbindungen auf demselben Gerät zuzulassen.
Ich habe die lowlevel DNSServiceRegister Methode implementiert, um den Dienst in der folgenden Art und Weise bekannt zu geben: in der
DNSServiceErrorType error = DNSServiceBrowse(&serviceBrowseRef,
kDNSServiceFlagsDefault,
if_nametoindex("lo0"), //limit discovery to loopback as well
"_myservicetype._tcp",
NULL,
&serviceBrowseReply,
(__bridge void *)(self)
);
Testing:
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)
);
Auf der Clientseite I Entdeckung implementiert haben wie folgt Der iPhone-Simulator gibt die erwarteten Ergebnisse nicht zurück. Die Entdeckung findet den angekündigten Dienst nicht.
Einige weitere Graben:
Der Versuch, auf der Kommandozeile zu überprüfen, ob es dns-sd -B _myservicetype._tcp
gearbeitet, aber es findet nichts
Seltsamer folgende dns-sd -lo -B _myservicetype._tcp
(Limit für alle lokalen Schnittstellen statt Loopback) zeigt die erwartete, aber die Interface 0 (aber if_nametoindex sagt der Index 1)
kDNSServiceInterfaceIndexLocalOnly
anstelle von if_nametoindex("lo0")
als der Parameter für DNSServiceBrowse
den angekündigten Dienst zurückgibt. Der im Callback angegebene interfaceIndex ist wieder 0 (dasselbe Verhalten wie das Befehlszeilentool).
Und noch seltsamer, wenn ich kDNSServiceInterfaceIndexLocalOnly
verwenden, während der Dienst registrieren, die Interface des entdeckten Service ist 4294967295 (uint Überlauf?)
Ist das erwartete Verhalten (nicht erlaubt zu begrenzen Schnittstelle Loopback?) Oder sind Ich habe hier einen seltsamen Fehler bei der internen Handhabung von Schnittstellenindizes?
Für jetzt bin ich Registrierung und das Surfen mit kDNSServiceInterfaceIndexLocalOnly Konstanten, die Loopback oder eine andere lokale Schnittstelle verwenden können. Um eine Verbindung zu dem Socket herstellen zu können, der nur Verbindungen über die Loopback-Schnittstelle zulässt, lösche ich den aufgelösten Hostnamen und benutze stattdessen 'localhost' – JanR