Как проверить, заблокирован ли межсетевой экран порт 1900 UPnP и порт 5353 Bonjour - PullRequest
1 голос
/ 28 мая 2011

Я перечисляю все устройства локальной сети, использующие UPnP в C # .NET, я использую API-интерфейсы UPnP, предоставляемые Windows в C # .NET (добавляя ссылку на библиотеку COM UPnP). Когда UPnP Scan не видит какое-либо устройство, я должен проверить, заблокирован ли этот порт (1900) брандмауэром, и если да, я должен уведомить пользователя.

Код для сканирования устройств UPnP

UPnPDeviceFinder devFinder = new UPnPDeviceFinder();
UPnPDevices devices = devFinder.FindByType("upnp:rootdevice", 0);
Debug.WriteLine("Devices Count:=" + devices.Count);

Я подключил несколько устройств в локальной сети, и я могу видеть эти устройства в UPnP Scan. Когда я блокирую порт 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, но я никогда не получал никаких исключений, поэтому я не смог определить, открыт порт или заблокирован

...