2014-08-27 4 views
0

Я пинговаю хосты из списка строк (адресов). Все работает отлично, но когда хост недостижимый ping возвращает Result.Address: «0.0.0.0» вместо существующего адреса или имени хоста, которое я передал в функцию SendPingAsync. Вот мой код:Извлечение имени хоста ping из результата SendPingAsync

  var pingTasks = addresses.Select(address => 
      { 
       return new Ping().SendPingAsync(address); 
      }); 

      await Task.WhenAll(pingTasks); 

      StringBuilder pingResultBuilder = new StringBuilder(); 

      foreach (var pingReply in pingTasks) 
      { 
       pingResultBuilder.Append(pingReply.Result.Address); 
       pingResultBuilder.Append(" "); 

       pingResultBuilder.Append(pingReply.Result.Status); 
       pingResultBuilder.Append(" "); 

       pingResultBuilder.Append(pingReply.Result.RoundtripTime.ToString()); 
       pingResultBuilder.AppendLine(); 
      } 

      Console.WriteLine(pingResultBuilder.ToString()); 

Я нашел решение here, но мне нужно сделать то же самое в SendPingAsync функции вместо SendAsync. Как я могу получить пройденный host name/ip address от pingReply.Result?

+0

вы должны сделать DNS поиск на что-то, что не отвечает. –

+0

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

ответ

5

Вы можете написать метод расширения, используя SendAsync.

public static class MyExtensions 
{ 
    public static Task<PingResult> SendTaskAsync(this Ping ping, string address) 
    { 
     var tcs = new TaskCompletionSource<PingResult>(); 
     PingCompletedEventHandler response = null; 
     response = (s, e) => 
     { 
      ping.PingCompleted -= response; 
      tcs.SetResult(new PingResult() { Address = address, Reply = e.Reply }); 
     }; 
     ping.PingCompleted += response; 
     ping.SendAsync(address, address); 
     return tcs.Task; 
    } 

    public class PingResult 
    { 
     public string Address { set; get; } 
     public PingReply Reply { set; get; } 
    } 
} 

Теперь вы можете использовать его как:

var pingTasks = addresses.Select(address => 
{ 
    return new Ping().SendTaskAsync(address); 
}); 

var replies = await Task.WhenAll(pingTasks); 

StringBuilder pingResultBuilder = new StringBuilder(); 

foreach (var pingReply in replies) 
{ 
    pingResultBuilder.Append(pingReply.Address); 
    pingResultBuilder.Append(" "); 

    pingResultBuilder.Append(pingReply.Reply.Status); 
    pingResultBuilder.Append(" "); 

    pingResultBuilder.Append(pingReply.Reply.RoundtripTime.ToString()); 
    pingResultBuilder.AppendLine(); 
} 

Console.WriteLine(pingResultBuilder.ToString()); 
+0

@TMcKeown Возвращая адрес сайта, который пингол :) См. Строку 'pingResultBuilder.Append (pingReply.Address);' –

+0

Я вижу, я думал, что проблема в том, что не было данных, я неправильно читал .... хорошее решение. –

+1

Да, работает как шарм. Благодаря! :) –