Сетевая трансляция/многоадресная рассылка не отправляется iPhone в режиме персональной точки доступа

Основываясь на недавних эмпирических данных и на основе различных сообщений в Интернете, кажется, что приложение, работающее на iPhone с включенной личной точкой доступа, не может отправлять широковещательные и/или многоадресные рассылки в сеть личной точки доступа. Может ли кто-нибудь пролить свет на причину этой проблемы?

Приложение

У меня есть приложение IOS, созданное с использованием кросс-платформенного кода C++, которое транслирует свое присутствие в сеть, в которой оно работает. Приложение работает безупречно, когда iPhone подключен к сети Wi-Fi. В этом случае другие устройства в сети принимают широковещательные/многоадресные рассылки, и все работает корректно. Это можно легко проверить, подключив к сети компьютер с установленным WireShark — широковещательные/многоадресные пакеты можно увидеть в трассировке пакетов.

Излишне говорить, что приложение хорошо работает на iPhone, подключенном к локальной сети Wi-Fi.

Проблема

Когда я запускаю приложение на iPhone, на котором включена личная точка доступа, никакие широковещательные/многоадресные рассылки не передаются в сеть точки доступа. Это можно проверить с помощью WireShark, который не показывает таких пакетов в своей трассировке.

Существуют ли какие-либо ограничения в отношении использования персональной точки доступа в качестве сетевого маршрутизатора, способного обрабатывать широковещательные и многоадресные рассылки?

Когда я запросил веб-страницу на своем устройстве «WireSharking» с помощью браузера, персональная точка доступа правильно отвечает на все пакеты, возвращая веб-содержимое.

Дополнительная информация

Я столкнулся с другими прошлыми переполнениями стека, которые сообщают о тех же или подобных проблемах:

  1. TCP-соединение не работает должным образом при использовании iPhone в качестве точки доступа
  2. Не удалось отправить трансляцию ssdp через личную точку доступа

Хорошим учебным пособием по написанию такого приложения для вещания/многоадресной передачи на iPhone является книга Майкла Тайсона « The Making of Talkie: Multi-interface Broadcasting and Multicast ». Достаточно сказать, что мое приложение соответствует всем требованиям (например, установка параметров сокета SO_BROADCAST, SO_DONTROUTE и IP_MULTICAST_IF, где это необходимо).

Ответ на ссылку (1) выше пишет: « Может ли это быть потому, что личная точка доступа вводит преобразование сетевых адресов? ». Я отфильтровал трассировки WireShark, чтобы показать только пакеты, подключенные к IP-адресу точки доступа, и нет никаких доказательств того, что личная точка доступа отправляет что-либо на адрес NAT.

В итоге

Может ли кто-нибудь объяснить, почему iPhone с личной точкой доступа не передает широковещательные/многоадресные пакеты и как решить эту проблему?

Спасибо заранее.

PS Первоначально я разместил этот запрос на Stack Overflow и узнал об этом более ориентированном на Apple форуме.

Ответы (1)

Быстрый и грязный обходной путь

Я также столкнулся с той же проблемой при разработке приложения для iPhone, которое использует многоадресное сообщение UDP для обнаружения устройств в сети. Судя по всему, iPhone блокирует многоадресные сообщения в режиме личной точки доступа.

Однако iPhone, по-видимому, использует 172.20.10.0/28подсеть для устройств в личной сети. Это означает, что существует всего 16 возможных адресов. Из них, 172.20.10.0по-видимому, не используется 172.20.10.1сам iPhone, и отправка сообщений на него 172.20.10.15завершается с ошибкой «не разрешено». Это означает, что клиенты могут использовать только следующие 13 адресов: 172.20.10.2, 172.20.10.3, ..., 172.20.10.14.

Таким образом, мой обходной путь довольно прост: вместо того, чтобы отправлять широковещательные сообщения только на 224.0.0.0, я также отправляю их на все другие возможные адреса в подсети ( 172.20.10.2- 172.20.10.14).

Конечно, чтобы быть готовым к будущему в рабочем приложении, вам, вероятно, следует проверить список сетевых интерфейсов, проверить IP-адрес, подсеть и т. д., но для моего личного использования этого метода достаточно.

Здесь я нашел еще лучшее решение: stackoverflow.com/a/40524524/322427