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