SSDP Multicast Отсутствующие ответы от M-SEARCH - Discovery - UPnP

Я пытаюсь получить сообщения UPnP NOTIFY от устройств UPnP в моей сети. Но когда я отправляю сообщение M-SEARCH, я иногда не получаю ответов. Мой код выглядит так:

public bool StartListener()
{
  if (this.ssdpSocket == null)
  {
    IPAddress localIpAddress = IPAddress.Any; 
    IPEndPoint localIpEndpoint = new IPEndPoint(localIpAddress, SsdpPort);

    try
    {
      this.ssdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
      this.ssdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

      this.ssdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, 16384); 

      this.ssdpSocket.Bind(localIpEndpoint);
      this.ssdpSocket.SetSocketOption(
        SocketOptionLevel.IP,
        SocketOptionName.AddMembership,
        new MulticastOption(IPAddress.Parse(SsdpMulticastAddress), localIpAddress));

      this.ssdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2);
      this.ssdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);

      this.culture = Thread.CurrentThread.CurrentUICulture;
      this.workerThreadListener = new WorkerThread(this.ssdpSocket, this.HandleSsdpMessage);
      this.workerThreadListener.Start();

      Log.InfoFormat("SSDP server bind successful [{0}]", localIpEndpoint);

      return true;
    }
    catch (Exception exception)
    {
      Log.Info(string.Format("SSDP server bind failed [{0}]", localIpEndpoint), exception);
      throw;
    }
  }

  return false;
}

Я нашел следующий ответ, но для меня невозможно изменить порт. Есть ли альтернативное решение?

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


person Kingpin    schedule 21.05.2014    source источник
comment
Почему нельзя изменить порт (или использовать 0 для любого порта)? Вы не можете просто ожидать, что определенный порт будет гарантированно неиспользован чем-то другим.   -  person Jussi Kukkonen    schedule 23.05.2014
comment
1900 — стандартный порт для ssdp. Поэтому, если я хочу найти все ssdp-устройства в своей сети, я не могу изменить порт   -  person Kingpin    schedule 23.05.2014
comment
Нет, это недоразумение. Вы (точка управления) отправляете M-SEARCH на 239.255.255.250:1900. Отвечающие устройства отправят свои ответы на любой IP-адрес и порт, с которого вы отправили сообщение. Таким образом, вы можете (и должны) позволить операционной системе выбрать для вас любой неиспользуемый порт.   -  person Jussi Kukkonen    schedule 23.05.2014
comment
Тогда почему я не нахожу устройства при смене порта?   -  person Kingpin    schedule 23.05.2014
comment
@Kingpin, вам нужно изменить вызов AddMembership на жестко заданный порт 1900, а не использовать порт из localIpAddress   -  person simonc    schedule 23.05.2014
comment
@simonc - неправильно. членство вообще не требуется при выполнении M-SEARCH. Способ M-SEARCH заключается в том, что вы отправляете (многоадресную) дейтаграмму и получаете обратно одноадресную рассылку с устройств на исходный порт.   -  person Nas Banov    schedule 03.03.2016


Ответы (1)


Это чистая удача, что это сработало для вас - скорее, это сработало по причинам, отличным от ожидаемых.

Вы получили сообщения NOTIFY, потому что вы начали прослушивать многоадресные рассылки как член группы - UPnP периодически осуществляет многоадресную рассылку своего присутствия соседям на 1900, без поисковых запросов.

С другой стороны, когда вы отправляете M-SEARCH (многоадресный, предположительно), вы должны оставаться и слушать на эфемерном порту, так как туда будут приходить одноадресные ответы.

person Nas Banov    schedule 02.03.2016