2010-07-24 44 views
9

He estado trabajando en un proyecto por un tiempo y tiene un servidor HTTP incorporado que se ejecuta en el puerto 8080. Se les dice a los usuarios que accedan al dispositivo a través, p. http://192.168.1.4:8080/ - funciona muy bien. Recientemente, me di cuenta de que las aplicaciones PUEDEN usar el puerto 80 para eliminar la necesidad de ": 8080", aunque si trato de configurar el puerto en 80, aparece un error con "Error general CFSocket".Servidor web en el puerto 80 en el iPhone

¿Alguna idea de cómo habilitar el puerto 80 para un servidor web en una aplicación?

algunas capturas de pantalla donde esto está sucediendo:

En primer lugar - en el iPad, la aplicación muestra el URL donde se puede acceder a ella.

iPad http://enrogue.com/port80/ipad.jpg

Segundo - Firefox, de acuerdo con IP:

FF by IP http://enrogue.com/port80/firefox_byip.png

Los anteriores son de una aplicación real en la tienda, no es magia jailbreak ni nada. Sé que los puertos < 1024 están reservados para el administrador en sistemas UNIX, por lo que la aplicación anterior obviamente está haciendo algo específico para obtener acceso al puerto.

+1

Hay alguna posibilidad de otra aplicación utiliza este puerto, o de abrir el puerto en el pasado con su aplicación y se olvidó de limpiar correctamente? ¿Intentó apagar y volver a encender el teléfono y luego probarlo de nuevo? – Steve

+0

Abro mi aplicación, bloqueo, abro otra aplicación, funciona, abro mi aplicación y bloqueo. No, no es un problema de limpieza. – Kalle

+0

Ah, y esto no es iOS 4, por lo que no se están ejecutando otras aplicaciones. Y creo que mantener un socket de red en iOS 4 mientras está en segundo plano da como resultado la terminación inmediata, por lo que no debería ser así incluso entonces. – Kalle

Respuesta

5

Puede enlazar al puerto 80 en la interfaz IPv4 del dispositivo pero no en la interfaz IPv6 y no en el simulador. Tendrá que modificar el código de socket para escuchar sólo en la interfaz IPv4, para el simulador se puede utilizar de forma condicional un puerto diferente:

#if TARGET_IPHONE_SIMULATOR 
    [httpServer setPort:8080]; 
#else 
    [httpServer setPort:80]; 
#endif 
+0

No estoy usando el Sim, así que ese no es el problema. Supongo que el código del socket es el culpable. ¡Empujaré y comentaré de nuevo! – Kalle

+0

Santo ... funcionó. ¡Rock, Sr. Matt! :) – Kalle

+0

Por supuesto, esto deja el problema: ¿qué pasa con los usuarios que QUIEREN IPv6? Supongo que puede poner algún valor de configuración en alguna parte que habilite IPv6 si el puerto es> 1024, pero hm, preferiblemente Apple debería permitirle usar el puerto 80, punto. – Kalle

4

iPhone está basado en Unix. Los puertos por debajo de 1024 están reservados para el root/superuser. Debe ser root para usar esos puertos.

+0

Sí. En otras palabras, no puede abrir puertos por debajo de 1024, excepto cuando se ejecuta como root en un teléfono con jailbreak. –

+0

Supuse que este era el caso, que obviamente no lo es, porque las aplicaciones están accediendo al puerto 80. Mira Air Sharing. Es un poco caro, pero lo hace. al menos la versión HD para iPad. – Kalle

Cuestiones relacionadas