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

我已经在iOS环境(用于iOS的Monotouch,在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));
        }
    }
}

最佳答案

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

我的程序正在端口1900上发送M-SEARCH,该端口绑定(bind)到UPnP多播组。因为我将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/

10-12 20:34