2017-12-19 4 views
0

Ich habe eine iPhone-App, die UPnP-Abfragen über Wi-Fi macht, um eine Wi-Fi-verbundene Kamera zu finden, die GCDAsyncSocket verwendet. Alle Kommunikationen verwenden IPv4-Adressen über ein Ad-hoc-Netzwerk, das von den Kameras selbst erstellt wurde, und die App funktioniert ordnungsgemäß mit mehr als 2500 Feldbereitstellungen.iPhone: IPv4 Wi-Fi-Zugang schlägt fehl mit Mobilfunk aktiviert

Allerdings habe ich einen Kunden, für den es auf seinem iPhone scheitert, es sei denn, der Flugmodus ist aktiviert oder die Mobilfunkdaten sind ausgeschaltet. Die gleiche Kamera funktioniert gut mit seinem iPad mini, also ist es nicht die Schuld der Kamera, die wir am besten bestimmen können.

Die App setzt eine Zuhörens Muffe:

_listenSocket = [[GCDAsyncSocket alloc] initWithDelegate:self 
       delegateQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)]; 

_listenSocket.IPv6Enabled = NO; 

accepted = [_listenSocket acceptOnInterface:getWirelessInterface() 
             port:_upnpPort error:&error]; 

Es setzt dann einen Sende-Socket, auch mit IPV6 deaktiviert up; verbindet sich über die drahtlose Schnittstelle mit dem Host (an einer bekannten oder vermuteten IP-Adresse); und sendet eine UPnP SUBSCRIBE-Nachricht:

_sendSocket = [[GCDAsyncSocket alloc] initWithDelegate:self 
       delegateQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)]; 

if (!_sendSocket) { 
    NSLog(@"sendMsg: unable to allocate sendSocket"); 
    return; 
} 

_sendSocket.IPv6Enabled = NO; 

NSError *err = nil; 
if (![_sendSocket connectToHost:hostParts[0] 
       onPort:[hostParts[1] intValue] 
      viaInterface:getWirelessInterface() 
      withTimeout:TIMEOUT 
       error:&err]) // Asynchronous! 
{ 
    // If there was an error, it's likely something like 
    // "already connected" or "no delegate set" 
    NSLog(@"socket connectToHost error: %@", err); 
    return; 
} 

[_sendSocket writedata: [msg dataUsingEncoding: NSUTF8StringEncoding] withTimeout: TIMEOUT tag: 1];

Normalerweise funktioniert das wie erwartet. In diesem Fall schlägt der Sendevorgang fehl. die delegierte Methode socketDidDisconnect: withError: wird aufgerufen:

sendSocket disconnected with error: Error Domain=GCDAsyncSocketErrorDomain 
Code=8 "IPv6 has been disabled and DNS lookup found no IPv4 address." 

Wenn ich die "xxxSocket.IPv6Enabled = NO;" löschen Linien, erhalte ich diese statt:

listenSocket disconnected with error: Error Domain=NSPOSIXErrorDomain 
Code=65 "No route to host" 

Verschiedene Googlings zeigen, dass „keine Route zum Host“ eine IPv4-Adresse angibt, nicht in einer IPv6-Umgebung gelöst werden kann, und die „IPv6 deaktiviert und DNS-Lookup gefunden keine hat IPv4-Adresse "Nachricht ist selbsterklärend.

Warum passiert das auf diesem einen iPhone und nicht auf allen anderen (einschließlich meiner eigenen Testinstrumente)? Wie kann ich es beheben, abgesehen davon, dass ich "mobile Daten ausschalten" sage? Warum ist DNS überhaupt beteiligt, wenn ich die IPv4-Adresse des eigentlichen Routers (Ad-hoc Access Point) verwende, mit dem ich das Netzwerk bereits gestartet habe?

(Ein anderer Beitrag Stackoverflow (GCDAsyncUdpSocket immediately closes when sending to an IPv6 address) vorgeschlagen erneuter Versuch, bis die Dinge gearbeitet, aber ich habe keinen Erfolg damit gehabt.)

+0

UPnP sagt DNS kann verwendet werden, um Dinge zu lösen: > Wenn das Gerät während der DHCP-Transaktion einen Domänennamen beispielsweise über einen DNS-Server oder über DNS-Weiterleitung erhält, sollte das Gerät diesen Namen im nachfolgenden Netzwerk verwenden Operationen; Andernfalls sollte das Gerät seine IP-Adresse verwenden. ** https: //en.wikipedia.org/wiki/Universal_Plug_and_Play#Protocol –

Antwort

0

Ich habe nicht in der Lage gewesen um herauszufinden, warum dies geschieht, ist: Es betrifft mindestens zwei Menschen auf T-Mobile in Florida und Kalifornien, aber ich kann es nicht mit T-Mobile in Washington replizieren.

Ich habe eine Lösung gefunden: Ersetzen connectToHost durch connectToAddress, die direkt an die IPv4-Adresse ohne einen DNS-Auflösungsschritt verbindet. Während connectToHost entweder einen Hostnamen oder eine IP-Adresse zulässt, führt es einen DNS-Lookup-Schritt sogar mit einer IP-Adresse durch, und diese Suche wurde durch das, was vorkam, wenn die betroffenen iDevices mit T-Mobile verbunden waren, verwirrt.

Verwandte Themen