c# - UPnP 组播 : missing answers from M-SEARCH (Discovery)

标签 c# windows upnp ssdp

我创建了一个小程序来测试 UPnP 多播(Visual C# 2010 Express,在 Windows 7 Professional 64 位上运行)。我可以从网络中的 UPnP 设备接收 UPnP NOTIFY 消息。但是当我发送 M-SEARCH 消息时,我没有收到任何答复。

我已经在 iOS 环境(Monotouch for iOS,在 Mac 上的 iPhone 模拟器上运行)上测试了相同的代码。它在那里运行良好,我从我的 UPnP 设备获得了所有搜索响应。我还可以从我的 Windows 程序中看到 M-SEARCH 消息。

Windows(或防火墙?)似乎隐藏了搜索响应。有什么想法吗?

代码如下:

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 1900);
IPEndPoint MulticastEndPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);

Socket UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
UdpSocket.Bind(LocalEndPoint);
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastEndPoint.Address, IPAddress.Any));
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 2);
UdpSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastLoopback, true);

Console.WriteLine("UDP-Socket setup done...\r\n");

string SearchString = "M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:3\r\n\r\n";

UdpSocket.SendTo(Encoding.UTF8.GetBytes(SearchString), SocketFlags.None, MulticastEndPoint);

Console.WriteLine("M-Search sent...\r\n");

byte[] ReceiveBuffer = new byte[64000];

int ReceivedBytes = 0;

while (true)
{
    if (UdpSocket.Available > 0)
    {
        ReceivedBytes = UdpSocket.Receive(ReceiveBuffer, SocketFlags.None);

        if (ReceivedBytes > 0)
        {
            Console.WriteLine(Encoding.UTF8.GetString(ReceiveBuffer, 0, ReceivedBytes));
        }
    }
}

最佳答案

是的,我解决了这个问题!小错误,大影响:

我的程序在绑定(bind)到 UPnP 多播组的端口 1900 上发送 M-SEARCH。因为我将 LocalEndPoint 绑定(bind)到同一个端口,所以 UPnP 设备通过单播应答到端口 1900。在 iOS 上它有效,因为我的程序是绑定(bind)到该端口的唯一服务。但是在 PC 上,我发现有几个服务绑定(bind)到端口 1900(通过“netstat -p UDP -a”找到)。因此来自 UPnP 设备的单播消息被其他服务之一吸收。

解决方案:我将 LocalEndPoint 绑定(bind)到一个空闲端口(例如 60000),现在它可以正常工作了!

IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 60000);

关于c# - UPnP 组播 : missing answers from M-SEARCH (Discovery),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794761/

相关文章:

c# - 委托(delegate)、操作和内存分配

c# - 用户似乎没有在 dotnet core 2.0 中的“Use”管道中进行身份验证

c++ - 从 windows 可执行文件复制机器代码并在 linux 上运行

Windows:在批处理文件中,将多行写入文本文件?

c# - 另一个进程异常使用的文件

c# - 报警前10秒执行命令

c# - 通过计算零位以科学记数法显示非常大或非常小的数字

java - 如果我有所有 ip 信息,绕过 P2P 应用程序的 NAT?

java - 这个官方 Xml 模式是否无效或者是 Jaxb 的错误限制

command-line - 如何从命令行推送 DLNA 内容