Android Multicast сокет перестает слушать - PullRequest
3 голосов
/ 22 октября 2010

У меня есть сервис на Android, который прослушивает и отвечает на пакеты, полученные через многоадресную рассылку.

Это работает большую часть времени, но, к сожалению, я обнаруживаю, что время от времени он просто прекращает получать пакеты. Поток остается заблокированным при вызове MulticastSocket.receive (), но ничего не выходит. Я медленно пытался отследить, что это вызывает, и обнаружил, что выключение и повторное включение беспроводного соединения или изменение беспроводного соединения сделает это.

Чтобы успешно продолжить прослушивание моих пакетов, мне нужно закрыть MulticastSocket и заново создать его. Тем не менее, я не нашел никакого способа сделать это - я не получаю никаких уведомлений о том, что что-то произошло: никаких намерений, никаких исключений Java, ничего. Я ожидал бы, что при получении будет выдано исключение IOException, если сокет стал недействительным, но, похоже, этого не происходит.

Может ли кто-нибудь предложить какое-либо понимание относительно (а) того, что на самом деле происходит, и (б) как обойти это? Прямо сейчас мое лучшее предположение - постоянно разрушать и воссоздавать сокет каждые десять секунд или около того, и это просто зло.

Ответы [ 2 ]

3 голосов
/ 23 октября 2010

Примечание. Этот ответ имел смысл, когда вопрос задавался в 2010 году, вероятно, он не имеет значения сегодня.

Я бы подумал, что смена беспроводных сетей во многом схожа с отключением и повторным включением сети (вероятно, с другим IP и маршрутизацией), поэтому неудивительно, что что-то сломалось.

Возможно, регистрация изменений в сетевой информации выдаст вам необходимое предупреждение?

http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

и связанные страницы

2 голосов
/ 22 октября 2010

Вы получаете блокировку многоадресной рассылки?

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = manager.createMulticastLock("lock name");
lock.setReferenceCounted(true);
lock.acquire();

Также кажется, что некоторые устройства блокируют многоадресную рассылку:

Многоадресная рассылка на Android 2.2

...