Отправить несколько пингов, не дожидаясь ответа Windows C#

В настоящее время я занимаюсь исследованием моего последнего проекта бакалавриата. Конечный продукт будет включать функцию отслеживания местоположения в помещении. Традиционным или наиболее часто используемым методом является триангуляция RSSI, но я очень хочу попытаться повысить точность метода PING, поскольку я думаю, что он лучше подходит для мест, которые могут страдать от затухания сигнала (места, которые я собираюсь исследовать). использование устройства может иметь умеренное количество радиопомех).

Мне было интересно, можно ли написать программное обеспечение на С#, которое имитировало бы способность ping-флуда утилиты ping Linux (которая позволяет отправлять несколько пингов, не дожидаясь ответа). Я предполагаю, что использование нескольких эхо-запросов и синхронизация их от первого до последнего позволит использовать этот метод на более коротких расстояниях.

Огромное спасибо

Дилан


person Dylan Jackson    schedule 26.07.2011    source источник


Ответы (2)


попробуй это надеюсь нормально работает

private ArrayList IPList()
        {
            string myipsplit = string.Empty;
            string myip =
                Dns.GetHostAddresses(
                    Dns.GetHostName())[0].ToString();
            string[] myiparray = myip.Split(new[] {'.'});
            for (int j = 1; j < myiparray.Length; j++)
                myipsplit += myiparray[j - 1] + ".";
            var sb = new ArrayList();
            MyPing ping = delegate(int id)
                              {
                                  string ls = myipsplit + id;
                                  var pingSender = new System.Net.NetworkInformation.Ping();
                                  PingReply reply = pingSender.Send(ls, 0);
                                  if (reply != null)
                                      if (reply.Status == IPStatus.Success)
                                          sb.Add(ls);
                              };
            var asyncResults = new IAsyncResult[0x100];
            for (int i = 1; i < 0x100; i++)
                asyncResults[i] = ping.BeginInvoke(i, null, null);
            for (int i = 1; i < 0x100; i++)
                ping.EndInvoke(asyncResults[i]);
            return sb;
        }

        #region Nested type: MyPing

        private delegate void MyPing(int id);

        #endregion
person arun kumar non ascii    schedule 26.07.2011
comment
Спасибо, я попробую, когда буду в стадии разработки. Прямо сейчас я все еще изучаю возможности :) - person Dylan Jackson; 26.07.2011
comment
Цикл .Net 4.0 parallel.For выполняется сравнительно быстрее, чем вы ожидаете. всего наилучшего для ваших исследований ... - person arun kumar non ascii; 26.07.2011
comment
посетите stackoverflow.com/questions/5978896/ - person arun kumar non ascii; 26.07.2011

Вы должны использовать функцию Ping.SendAsync(). Как указано на странице MSDN:

Каждый вызов этого метода выполняется в отдельном потоке, который автоматически выделяется из пула потоков. По завершении асинхронной операции возникает событие PingCompleted. Чтобы указать метод, который вызывается, когда SendAsync создает событие, необходимо добавить к событию делегата PingCompletedEventHandler перед вызовом SendAsync.

Вот великолепный пример того, как это сделать: http://msdn.microsoft.com/en-us/library/a63bsyf0.aspx

person Timothée Bourguignon    schedule 26.07.2011
comment
Вы можете посмотреть в этой теме пример использования функции SendAsync(): stackoverflow.com/questions/6602845/ - person Timothée Bourguignon; 26.07.2011