Хобрук: Ваш путь к мастерству в программировании

Постоянный прослушиватель UDP-рассылок SSDP

Я реализовал пример кода, приведенный в этом нить. Это работает удовольствие, как и было обещано. К сожалению, он сообщит только о прямых ответах на запрос M-SEARCH, но больше ничего. Я ищу способ просто слушать трансляции SSDP, чтобы захватить поиск другого приложения или уведомить трансляции.

Я пробовал всевозможные конфигурации с TIdUDPServer, но ни одна из них не увенчалась успехом. Я дошел до того, что считаю, что это может быть невозможно.

Я использую Win 8.1 с включенным Network Discovery и MediaServer на другом компьютере в той же сети. Брандмауэр вкл или выкл не имеет значения. Использование API Windows для UPnP работает должным образом, и приложения, использующие UPnP, правильно обнаруживают MediaServer и другие устройства UPnP.

Захватывает ли встроенная в Windows служба UPnP эти трансляции на частоте 239:255:255:250:1900 и не передает ли их дальше? Как я могу просто слушать эти передачи?

24.08.2016

  • SSDP не широковещательный, это многоадресный UDP. Это означает, что ваш сервер должен присоединиться к группе многоадресной рассылки, прежде чем сообщения будут доставлены (ответы M-SEARCH не являются многоадресными, поэтому они работают). Я не писал это как ответ, так как не знаю TldUDPServer. 24.08.2016
  • Я думаю, вам нужно использовать TIdIPMCastClient 24.08.2016
  • Спасибо джиу. Смотрите ответ ниже. Я думаю, я не могу слушать трансляции и отправлять свой собственный ssdp обнаружения с тем же экземпляром класса сервера, верно? Это должно быть разделено на два экземпляра, один для слушателя, один для запросов на обнаружение и их ответов, верно? 24.08.2016

Ответы:


1

jku указал мне правильное направление. Класс TIdUDPServer предоставляет метод AddMulticastMembership, который помогает. Спасибо джку!

Ниже код, который работает:

var
  server : TIdUDPServer;

...

with server do
  Active := false;
  BroadcastEnabled := true;
  DefaultPort := 1900;
  Binding.IP := GStack.LocalAddress;
  Binding.AddMulticastMembership('239.255.255.250');
  active := true;
end;

Я возился со всевозможными конфигурациями и тестами, пока не заметил, что мой брандмауэр что-то занес в черный список. Еще нужно выяснить, что это было, но отключение FW для тестов, безусловно, помогло. Сброс моего роутера тоже. Кроме localhost я ничего не видел, и после перезагрузки маршрутизатора все UPnP-устройства в сети снова стали видны. Проводной. Больше вещей, которые мне нужно понять....

Еще раз спасибо и привет

Карстен

24.08.2016
  • Как заявил Йохан в другом комментарии, вы должны использовать TIdIPMCastClient вместо TIdUDPServer. TIdIPMCastClient является многоадресным клиентом UDP и вызывает AddMulticastMembership() для вас. Просто установите свойство TIdIPMCastClient.MulticastGroup для многоадресной группы, к которой вы хотите присоединиться. 25.08.2016
  • Сейчас я использую клиент IPMCast для прослушивания трансляций, и он отлично работает для Win32. К сожалению, под IOS и Android ничего не получит. Я прочитал в другом потоке, что GStack.LocalAddresses не реализован для Android и что он находится в списке задач. Это относится и к клиенту IPMCast? 15.01.2017
  • С точки зрения кодирования компоненты IPMCast реализованы на всех платформах. Но с точки зрения логистики у Android (не уверен насчет iOS) есть дополнительные требования, которые Indy не учитывает: stackoverflow.com/questions/3179710< /а>. В частности, вызов функции Android WifiManager.createMulticastLock() требуется, чтобы стек сокетов Android не отбрасывал многоадресные пакеты. Вам придется вызывать это вручную в своем коде, используя среду Delphi JNI Bridge. 15.01.2017
  • Спасибо, Реми! Никогда не работал с JNI. Я думаю, что я припаркую это на время и займусь другими вещами ... 20.01.2017
  • Ничего себе, куда ни глянь, даже продвинутые и известные разработчики откладывают такой проект в сторону. У меня действительно есть проблема, когда андроид возвращает 127.0.0.1 в качестве IP-адреса своего устройства, что, очевидно, никогда не позволит такой вещи работать. И тот факт, что Apple требует IPv6... то, что казалось простой идеей, превратилось в чудовищное предприятие. 07.10.2017
  • @JerryDodge На данный момент я отложил все для iOS из-за проблемы, описанной в другом вопросе. В целом у меня проблемы с тем, чтобы заставить его работать так, как я хочу (даже в Windows). Либо так, либо я неправильно понимаю, как это должно работать (вещь XY). Если вы делаете что-то подобное, возможно, мы могли бы сотрудничать? 08.10.2017
  • @JerryDodge Вот ссылка на мои проблемы с Windows: forums.embarcadero.com/thread.jspa ?threadID=252980 08.10.2017
  • @DaveNottage Спасибо, в настоящее время я сосредоточен на других частях нашего приложения с более высоким приоритетом, и мы повысили обнаружение серверов до нашего самого низкого приоритета на данный момент. У нас потенциально есть другое решение, которое мы рассматриваем вместо этого, поэтому я воздержусь от этой части. 09.10.2017
  • Новые материалы

    Ускорение регулярных выражений в 127 раз за 2 строки кода
    Скомпилируйте регулярное выражение и… Я столкнулся с неприятным узким местом Regex на работе. Мне нужно было извлечь 600–800 миллионов строковых шаблонов из гигантского корпуса..

    Понимание структуры каталогов Linux
    Структура каталогов Linux — это иерархическая организация файлов и каталогов в системе Linux. Понимание этой структуры важно для всех, кто хочет использовать Linux в качестве основной..

    Введение в SQLite3 в Python
    SQLite3 — это популярная и часто используемая программная библиотека для управления реляционными базами данных. Она портативна, быстра и проста в использовании, что делает ее отличным выбором..

    Как создать ORM в Node.js
    Что такое ОРМ? Проще говоря, система ORM — это метод, в котором вы используете объектно-ориентированную парадигму для создания сопоставления между приложением и базой данных для выполнения..

    Руководство для начинающих по обработке естественного языка .
    Обработка естественного языка — захватывающая и быстро развивающаяся область, которую можно охарактеризовать как сочетание лингвистики, информатики и искусственного интеллекта. Это помогает..

    Защитите свое приложение NodeJS с помощью веб-токенов JSON (JWT): руководство по аутентификации на основе токенов
    В современном мире веб-приложений безопасность важнее, чем когда-либо. Одним из наиболее важных аспектов защиты веб-приложений является аутентификация пользователей. Аутентификация на основе..

    Вводное руководство по аннотациям @PreAuthorize и @PostAuthorize в Spring Security
    Введение Spring Security — это мощная и настраиваемая среда аутентификации и контроля доступа для приложений Java, особенно тех, которые созданы с использованием среды Spring. Этот пост..