我列出了在 C# .NET 中使用 UPnP 的所有局域网设备,我在 C# .NET 中使用 Windows 提供的 UPnP API(通过添加对 UPnP COM 库的引用)。当 UPnP 扫描没有看到任何设备时,我必须检查该端口 (1900) 是否被防火墙阻止,如果是,我必须通知用户。
扫描 UPnP 设备的代码
UPnPDeviceFinder devFinder = new UPnPDeviceFinder();
UPnPDevices devices = devFinder.FindByType("upnp:rootdevice", 0);
Debug.WriteLine("Devices Count:=" + devices.Count);
我在 LAN 中连接了多个设备,并且能够在 UPnP 扫描中看到这些设备。当我阻塞 1900 端口时, devFinder.FindByType("upnp:rootdevice", 0); 返回 0 个设备。所以我需要写一些端口扫描代码来告诉我端口是打开还是关闭。由于 UPnP 使用 UDP,当我尝试连接到“239.255.255.250:1900”地址时,我没有遇到任何异常。下面是我写的代码片段
try
{
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);
byte[] data = Encoding.ASCII.GetBytes("This is a test message");
server.SendTo(data, iep);
server.Close();
Console.WriteLine("UPnP Port is open");
}
catch(SocketException ex)
{
Console.WriteLine("UPnP Port is blocked by firewall");
}
我已经在防火墙中阻止了 1900 端口,所以我期待 SocketException,但我从来没有遇到任何异常,所以我无法找到端口是打开还是阻止