Проверка связи с несколькими устройствами одновременно вызывает таймаут? - PullRequest
1 голос
/ 08 июля 2019

Как и другие вопросы о пинге, нам нужно пинговать несколько IP-адресов одновременно.Мы думали, что у нас все работает отлично, выполнив множество ответов и примеров, однако мы испытываем неудачные эхо-запросы из-за тайм-аута, когда мы пытаемся пинговать их одновременно или даже близко друг к другу.

Мы проверили нашсписок IP-адресов на другой программе мониторинга пинга и тайм-аут не происходит.Проблема специфична для нашего приложения.

В нашем приложении каждое «устройство» имеет класс RouterProperties, в котором хранятся его Имя, IP-адрес и т. Д. Мы отправляем эхо-запрос из наблюдаемой коллекции этих устройств, получая их IP-адреса.из их RouterProperties.

  • Проверено разделение пингов на 10 (мс) / 20 (мс), ожидают task.delay
  • Проверено разделение пингов на 10 (мс) / 20 (мс), используятаймер диспетчера
  • Проверено эхо-тестирование одновременно без задержки, что приводит к наибольшему количеству тайм-аутов.
  • Тестирование конвертации "строк" IP-адреса в IP-адрес до эхо-запроса, видимых изменений в проблеме нет.
  • Проверено с таймаутом пинга 500 (мс), 1000 (мс), 5000 (мс) и т. Д.)
  • Текущий тест предназначен для 143 устройств, но должен уметь обрабатывать больше.
//OUR MAIN PING SCHEDULER
private async void PingAllDevices(object sender, EventArgs e)
{
 var allPingTasks = new List<Task>();    

  int numOfDevices = 1;    

   //Assign a task to each device.
     foreach (RouterProperties device in devices)
   {
                    await Task.Delay(10);
                    Console.WriteLine("Pinging device #" + numOfDevices + " : " + device.RouterIP);
                    numOfDevices++;
                    allPingTasks.Add(AsyncPingDevice(device));
                }

                //Block here for all created tasks.
                await Task.WhenAll(allPingTasks);    
     }
}

//OUR PING TASK
async Task AsyncPingDevice(RouterProperties device)
        {
            // Get device IP address to ping.
            string deviceIP = device.RouterIP;

            try
            {
                Ping pingSender = new Ping();
                PingOptions options = new PingOptions();
                var reply = await pingSender.SendPingAsync(deviceIP, (int.Parse(Properties.Settings.Default.PingTimeout)), buffer, pingOptions);
                Console.WriteLine(deviceIP + " has responded.");

                if (reply.Status == IPStatus.Success)
                {
                    device.PingCounter = 0;
                }
                else
                {
                    if (device.PingCounter <= 3)
                    {
                        device.PingCounter++;
                    }
                }
            }
            catch
            {
                if (device.PingCounter <= 3)
                {
                    device.PingCounter++;
                }
            }

            await Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action( () =>
                {
                    if (device.IsDeactivated != true)
                    {
                        switch (device.PingCounter)
                        {
                            case 0:
                                device.Color = "#FF8AA587";
                                break;
                            case 1:
                                device.Color = "#FF9AB999";
                                break;
                            case 2:
                                device.Color = "#FFFCCEAA";
                                break;
                            case 3:
                                device.Color = "#FFF4837D";                                   
                                break;
                            case 4:
                                device.Color = "#FFEB4960";
                                break;
                        }
                    }
                }));
    }

Когда мы запускаем наш код с задержкой task.de внутри планировщика ping и без нее, чтобы отделить пинги, мы получаем непоследовательные результаты от устройств, испытывающих эхо-запросы.

  • Без задержки = 75% времени ожидания всех устройств.
  • С задержкой = непостоянно случайное время ожидания 10% устройств за такт.
  • Аналогичная программа проверки связик нашим = 100% последовательные результаты без каких-либо тайм-аутов.
...