Según hallazgos empíricos recientes y varias publicaciones en la web, parece que una aplicación que se ejecuta en un iPhone con punto de acceso personal habilitado no puede enviar transmisiones y/o multidifusiones a la red del punto de acceso personal. ¿Alguien puede arrojar luz sobre la causa de este problema?
La aplicación
Tengo una aplicación IOS, creada con código C++ multiplataforma, que transmite y multidifunde su presencia en la red en la que se ejecuta. La aplicación funciona perfectamente cuando el iPhone está conectado a una red Wi-Fi. En este caso, otros dispositivos en la red reciben las transmisiones/multidifusiones y todo funciona correctamente. Esto se puede verificar fácilmente conectando una computadora que ejecuta WireShark a la red: los paquetes de transmisión/multidifusión se pueden ver en el seguimiento del paquete.
No hace falta decir que la aplicación funciona bien en un iPhone conectado a una red Wi-Fi local.
El problema
Cuando ejecuto la aplicación en un iPhone que tiene habilitado su punto de acceso personal, no se emiten transmisiones/multidifusiones en la red del punto de acceso. Esto se puede verificar usando WireShark, que no muestra dichos paquetes en su seguimiento.
¿Existe alguna restricción con respecto al uso de un punto de acceso personal como un enrutador de red capaz de manejar transmisiones y multidifusiones?
Cuando solicité una página web en mi dispositivo "WireSharking" usando un navegador, el punto de acceso personal responde correctamente a todos los paquetes, devolviendo los contenidos web.
Información colateral
Me he encontrado con otros Stack Overflow pasados que informan problemas iguales o similares:
Un buen tutorial para escribir una aplicación de transmisión/multidifusión de este tipo en iPhone es " The Making of Talkie: Multi-interface broadcasting and multicast " de Michael Tyson . Baste decir que mi aplicación cumple con todos los requisitos (por ejemplo, establecer las opciones de socket SO_BROADCAST, SO_DONTROOUTE e IP_MULTICAST_IF cuando corresponda).
Una respuesta a la referencia (1) anterior escribe " ¿Podría ser porque el punto de acceso personal introduce la traducción de direcciones de red? ". Filtré los rastros de WireShark para mostrar solo los paquetes conectados a la IP del punto de acceso, y no hay evidencia de que el punto de acceso personal envíe algo a una dirección NAT.
En resumen
¿Alguien puede explicar por qué un iPhone que ejecuta un punto de acceso personal no transmite/multidifunde paquetes y cómo resolver el problema?
Muchas gracias de antemano.
PD: originalmente publiqué esta consulta en Stack Overflow y aprendí sobre este foro más orientado a Apple.
Solución rápida y sucia
También me encontré con el mismo problema al desarrollar una aplicación para iPhone que usa un mensaje de multidifusión UDP para descubrir dispositivos en la red. Aparentemente, el iPhone bloquea los mensajes de multidifusión en el modo de punto de acceso personal.
Sin embargo, iPhone parece usar la 172.20.10.0/28
subred para dispositivos en la red de punto de acceso personal. Esto significa que solo hay 16 direcciones posibles. De estos, 172.20.10.0
aparentemente no se usa, 172.20.10.1
es el propio iPhone, y el envío de mensajes 172.20.10.15
falla con un error 'no permitido'. Esto significa que los clientes solo pueden utilizar las siguientes 13 direcciones: 172.20.10.2
, 172.20.10.3
, ..., 172.20.10.14
.
Entonces, mi solución es bastante simple: en lugar de enviar mensajes de difusión solo a 224.0.0.0
, también los envío a todas las demás direcciones posibles en la subred ( 172.20.10.2
- 172.20.10.14
).
Por supuesto, para estar preparado para el futuro en una aplicación de producción, probablemente debería verificar la lista de interfaces de red, verificar la IP y la subred, etc., pero para mi uso personal, este método es suficiente.
jakob egger