Многоадресная рассылка SSDP Отсутствуют ответы от M-SEARCH - Обнаружение - 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;
}
Я нашел следующий ответ, но для меня не возможно изменить порт. Есть ли альтернативное решение?
1 ответ
Это просто удача, это сработало для вас - скорее, это сработало по причинам, отличным от ожидаемых.
Вы получили сообщения NOTIFY, потому что вы начали прослушивать многоадресные рассылки в качестве члена группы - UPnP периодически многоадресно рассылает их данные о соседстве в 1900 году без поисковых запросов.
С другой стороны, когда вы отправляете M-SEARCH (многоадресный, предположительно), вы должны оставаться и слушать эфемерный порт, так как там будут приходить одноадресные ответы.