Отправить несколько пингов без ожидания ответа Windows C # - PullRequest
2 голосов
/ 26 июля 2011

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

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

Большое спасибо

Dylan

Ответы [ 2 ]

1 голос
/ 26 июля 2011

попробуйте эту надежду, она работает нормально

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
1 голос
/ 26 июля 2011

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

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

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

...