Transmisión / multidifusión de red no enviada por iPhone en modo de zona activa personal

3

Según los resultados empíricos recientes, y en base a varias publicaciones en la web, parece que una aplicación que se ejecuta en un iPhone con un 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, construida con código C ++ multiplataforma, que transmite y multica su presencia en la red en la que se está ejecutando. 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 difusiones / multidifusiones, y todo funciona correctamente. Esto se puede verificar fácilmente conectando una computadora con WireShark a la red; los paquetes de difusión / multidifusión se pueden ver en el rastreo de paquetes.

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 su zona de conexión personal habilitada, no se emiten emisiones / multicasts a la red de la zona de conexión. Esto se puede verificar mediante WireShark, que no muestra ningún paquete de este tipo 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 difusiones y transmisiones múltiples?

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 pasados de desbordamiento de pila que reportan los mismos problemas o similares:

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

Un buen tutorial para escribir una aplicación de difusión / multidifusión de este tipo en iPhone es " The Making of Talkie: transmisión multi-interfaz y multidifusión ". Basta con decir que mi aplicación cumple con todos los requisitos (por ejemplo, configurar las opciones de socket SO_BROADCAST, SO_DONTROUTE e IP_MULTICAST_IF cuando sea apropiado).

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 hotspot, y no hay evidencia de que el hotspot 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 emite paquetes de multidifusión y cómo resolver el problema?

Muchas gracias de antemano.

P.S. Originalmente publiqué esta consulta en Desbordamiento de pila , y aprendí sobre este foro más orientado a Apple.

    
pregunta Moshe Rubin 03.03.2015 - 04:43

1 respuesta

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. Al parecer, el iPhone bloquea los mensajes de multidifusión en el modo de zona activa personal.

Sin embargo, parece que el iPhone usa la subred 172.20.10.0/28 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 a 172.20.10.15 falla con un error "no permitido". Esto significa que los clientes solo pueden usar las siguientes 13 direcciones: 172.20.10.2 , 172.20.10.3 , ..., 172.20.10.14 .

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 revisar la lista de interfaces de red, verificar la IP y la subred, etc., pero para mi uso personal, este método es suficiente.

    
respondido por el Jakob Egger 10.11.2016 - 09:07

Lea otras preguntas en las etiquetas