【问题标题】:SSDP Multicast Missing answers from M-SEARCH - Discovery - UPnPSSDP 多播 缺少来自 M-SEARCH 的答案 - 发现 - UPnP
【发布时间】:2014-05-21 09:09:05
【问题描述】:

我正在尝试从我的网络中的 UPnP 设备接收 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 Multicast

【问题讨论】:

  • 为什么不能更改端口(或为任何端口使用 0)?您不能只期望某个特定端口被其他东西使用。
  • 1900 是 ssdp 的标准端口。因此,如果我想在我的网络上找到所有 ssdp 设备,我无法更改端口
  • 不,这是个误会。您(控制点)将您的 M-SEARCH 发送到 239.255.255.250:1900。响应设备会将其回复发送到您发送的任何 IP 和端口。因此,您可以(并且应该)让操作系统为您选择任何未使用的端口。
  • 那为什么我更改端口时找不到设备?
  • @Kingpin 您需要将AddMembership 调用更改为硬编码端口1900,而不是使用来自localIpAddress 的端口

标签: c# windows networking upnp ssdp


【解决方案1】:

这对您有用纯属运气 - 而是出于与预期不同的原因。

您收到 NOTIFY 消息是因为您作为该组的成员开始收听多播 - UPnP 在 1900 上定期将它们的存在多播到附近,没有搜索请求。

另一方面,当您发送 M-SEARCH(大概是多播)时,您应该留在临时端口上并监听,因为单播响应将会到达那里。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 2016-10-06
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多