2010-05-24 12 views
9

Estoy intentando leer de forma sincrónica desde un CFReadStream objetado creado por CFStreamCreatePairWithSocketToHost. La corriente abrió bien, pero cuando intento para invocar CFReadStreamRead en él en un bucle, CFReadStreamRead() devuelve -1 y el error resultante es:Recibiendo error Domain = kCFErrorDomainCFNetwork Code = 2 al intentar leer desde ReadStream

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

También estoy de recibir este mismo error exacto cuando se utiliza este ReadStream de forma asíncrona: la primera devolución de llamada que recibo es este error.

Respuesta

8

La historia corta: Probablemente un error de resolución de DNS.

Los documentos dicen "Las corrientes no se pueden abrir una conexión al host especificado hasta que una de las corrientes se abre", y por kCFGetAddrInfoFailureKey,

Consulta de esta tecla se devuelve el último código de error devuelto por getaddrinfo (3) en respuesta a una búsqueda de DNS. Para interpretar los resultados, busque el código de error en /usr/include/netdb.h.

netdb.h dice

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

Aceptar así que lo que es la solución entonces? ! Tengo una llamada de servicio RESTful que funciona bien en mi navegador, pero la misma solicitud a través de ASIHTTPRequest obtiene el error de esta publicación. ¿Alguien sabe a dónde ir desde aquí? – Mark

+2

-1 para esta respuesta, por no mencionar cómo moverse por el error y solo explica qué significa el error. – Shailesh

+9

@Shailesh: ¿Y cómo, exactamente, lo haces? ¿espera sortear una falla de DNS? –

2

que era capaz de solucionar este problema mediante la puesta en servidores DNS (8.8.8.8,8.8.4.4) de Google en la conexión wi-fi en la aplicación Ajustes. El problema era que nuestros dispositivos estaban en una red que primero requería que aceptara algunos términos de servicio en una página web de inicio de sesión proxy, al igual que los hoteles y cafeterías. Safari funcionó bien después de aceptar, pero la aplicación no lo hizo, incluso después de acordar en Safari. Cambiar a DNS alternativo funcionó (también lo hizo poner la dirección IP en lugar de la entrada DNS de nuestro servidor, pero no quería codificar una dirección IP).

1

Pude eliminar este error eliminando https:// de la cadena del servidor.

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

Es posible que necesite ajustar el nivel de seguridad apropiado:

inputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
outputStream!.setProperty(NSStreamSocketSecurityLevelTLSv1, forKey: NSStreamSocketSecurityLevelKey) 
Cuestiones relacionadas