2010-05-24 6 views
9

Je tente de lire de manière synchrone à partir d'un CFReadStream objecté créé par CFStreamCreatePairWithSocketToHost. Le ruisseau a ouvert bien mais quand je tente d'invoquer CFReadStreamRead sur elle dans une boucle, CFReadStreamRead() renvoie -1 et l'erreur résultant est:Erreur de réception Domaine = kCFErrorDomainCFNetwork Code = 2 lors de la tentative de lecture ReadStream

Error Domain=kCFErrorDomainCFNetwork Code=2 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)" UserInfo=0x14a920 {kCFGetAddrInfoFailureKey=8}

Je reçois également cette même erreur exacte lorsque vous utilisez cette ReadStream asynchrone - le premier rappel que je reçois est cette erreur.

Répondre

8

La nouvelle: Probablement une erreur de résolution DNS.

Les docs disent « Les cours d'eau ne pas ouvrir une connexion à l'hôte spécifié jusqu'à ce que l'un des cours d'eau est ouvert », et pour kCFGetAddrInfoFailureKey,

Interrogation cette touche ramène le dernier code d'erreur renvoyé par getaddrinfo (3) en réponse à une recherche DNS. Pour interpréter les résultats, recherchez le code d'erreur dans /usr/include/netdb.h.

netdb.h dit

#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 
+0

OK alors quel est le correctif alors? ! J'ai un appel de service RESTful qui fonctionne très bien dans mon navigateur, mais la même demande par l'intermédiaire de ASIHTTPRequest obtient l'erreur de cette publication Est-ce que quelqu'un sait où aller d'ici? – Mark

+2

-1 pour cette réponse, pour ne pas mentionner comment contourner le erreur et seulement expliquer ce que signifie l'erreur – Shailesh

+9

@Shailesh: Et comment, exactement, faites-vous s'attendre à contourner une défaillance DNS? –

2

j'ai pu résoudre ce problème en mettant dans les serveurs DNS de Google (8.8.8.8,8.8.4.4) dans la connexion wifi dans l'application Réglages. Le problème était que nos appareils étaient sur un réseau qui vous obligeait d'abord à accepter certaines conditions d'utilisation sur une page Web de connexion proxy, un peu comme les hôtels et les cafés font. Safari a bien fonctionné après accord, mais l'application n'a pas, même après avoir accepté dans Safari. Le changement de DNS alternatif a fonctionné (de même que la mise en place de l'adresse IP au lieu de l'entrée DNS de notre serveur, mais je ne voulais pas coder en dur une adresse IP).

1

J'ai réussi à éliminer cette erreur en supprimant https:// de la chaîne hôte.

NSStream.getStreamsToHostWithName (" https: // example.com" ...

Vous devrez peut-être définir le niveau de sécurité approprié:

inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
Questions connexes