Difusión/multidifusión de red no enviada por iPhone en modo punto de acceso personal

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:

  1. La conexión TCP no funciona correctamente cuando se usa el iPhone como punto de acceso
  2. Error al enviar la transmisión ssdp por punto de acceso personal

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.

Respuestas (1)

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/28subred para dispositivos en la red de punto de acceso personal. Esto significa que solo hay 16 direcciones posibles. De estos, 172.20.10.0aparentemente no se usa, 172.20.10.1es el propio iPhone, y el envío de mensajes 172.20.10.15falla 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.

Encontré una solución aún mejor aquí: stackoverflow.com/a/40524524/322427