Pregunta

Estoy intentando acceder 61616 en mi aplicación para el iPhone y el código SCReachability indica que tengo una red válida, pero tienen tiempo de espera que intenta escribir a 61616. ¿Alguien sabe:

A. Si la red iPhone EDGE / 3G tiene un rango de puertos limitada o no se le permite conectarse a este puerto?

B. ¿Cómo puedo comprobar explícitamente para el acceso a este puerto. Aquí está mi "es la red alcanzable" código (tomado de ejemplos de Apple), que busca "foo.bar.com", pero no muestra cómo comprobar "foo.bar.com:61616".

Cualquier ayuda se agradece!

- (BOOL)isDataSourceAvailable{
static BOOL checkNetwork = YES;
BOOL _isDataSourceAvailable = NO;
if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
    checkNetwork = NO;

    Boolean success;    
    const char *host_name = "foo.bar.com";

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
    CFRelease(reachability);
}
return _isDataSourceAvailable;

}

¿Fue útil?

Solución

La API SCNetworkReachability sólo comprueba si la dirección se pueden dirigir a. Citando la documentación:

  

"Accesibilidad" refleja si un dato   paquete, enviado por una aplicación en   la pila de red, puede salir del local,   computadora. Tenga en cuenta que la accesibilidad hace   no garantiza que el paquete de datos   realmente será recibido por el anfitrión.

Esto no tiene nada que ver con NAT o restricciones de puertos. El enrutamiento se basa en direcciones - no en los puertos. Así que todo lo puede saber (a través de SCNetworkReachability API) es si usted podría (en teoría) llegan a la interfaz de la máquina. No intenta establecer una conexión en un puerto determinado.

Así que con el fin de averiguar si ese servicio es accesible tendrá que tratar de ponerse a prueba. Preferiblemente, cuando la API SCNetworkReachability le dice que se puede establecer una conexión. Sólo trata de conectar con el servidor en el puerto 61616 y ver si se obtiene una conexión o un tiempo de espera. Los valores de tiempo de espera y manejo correcto es crucial aquí.

Otros consejos

Esto es algo que varía mucho de no sólo un soporte a otro, sino de un contrato a otro. Por ejemplo, aquí en el O2 Reino Unido restringir el acceso a Internet sólo para las direcciones web (presumiblemente los puertos 80 y 443, pero no el registro) para pay-as-you-go de los clientes, pero permite el acceso más o menos libre para personas con un contrato. (Espero que es un poco más abierto para los clientes de iPhone de reparto.)

Creo que el resultado práctico de esto es que no se puede asumir el acceso a los puertos altos en todo el mundo.

No estoy seguro de que hay una forma sencilla de comprobar que un determinado puerto está abierto, probablemente su mejor opción es utilizar un tiempo de espera "razonable". Por supuesto, hay una serie de razones por las que podría obtener el tiempo de espera para que su error tendría que ser adecuado vaga.

Si el iPhone está conectado a través de EDGE / móvil, que podría estar detrás de una puerta de enlace NAT por lo tanto usted no poder contactar con ella. Al menos ese es el caso con T-Mobile Alemania. El iPhone recibe una dirección IP RFC por T-Mobile (172.16.x.x).

Me gustaría probar con el iPhone conectado a la red Wi-Fi local y - si es posible - por lo general el diseño de la aplicación de una manera que los contactos del iPhone un servidor y el servidor se puede comunicar con el teléfono

.

¿Estás tratando de ponerse en contacto con su iPhone de una máquina externa?

Esto probablemente no funciona. Por lo general, la red GPRS / EDGE / UMTS bloques de infraestructura conexiones entrantes. De lo contrario, un abonado móvil podría ser facturado por el tráfico no deseado que no solicitó. (Imagínese que alguien ping a su iPhone una vez por segundo durante las próximas seis semanas. Se podría pagar por eso ...)

La solución es establecer una conexión desde el dispositivo móvil a la máquina remota y luego dejar que la máquina remota que utiliza para el tráfico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top