【发布时间】:2012-09-29 11:21:29
【问题描述】:
我创建了一个小程序来测试 UPnP 多播(Visual C# 2010 Express,在 Windows 7 Professional 64 位上运行)。我可以从我的网络中的 UPnP 设备接收 UPnP 通知消息。但是当我发送 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));
}
}
}
【问题讨论】:
-
MulticastEndPoint 设置为什么?
-
您确定您在 iOS 上看到的 M-SEARCH 是来自您的 Windows 程序的那个吗?您是否在 Windows 机器上尝试过其他 UPnP 发现工具?
-
@PavelZdenek:是的,我确定。我在 M-SEARCH 消息上附加了一些额外的字符,以便我可以在 iOS 上识别该消息。