我创建了一个小程序来测试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/