1

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 が発生することを期待していましたが、例外がまったく発生しないため、ポートが開いているかブロックされているかを確認できませんでした

4

0 に答える 0