从SendPingAsync结果检索ping主机名 [英] Retrieving ping host name from SendPingAsync result

查看:864
本文介绍了从SendPingAsync结果检索ping主机名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从字符串(地址)列表中ping主机。一切正常工作,但当主机无法访问ping返回 Result.Address :0.0.0.0而不是我传入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());

我发现解决方案这里,但是我需要在 SendPingAsync 函数,而不是 SendAsync
如何从 pingReply.Result 中检索已传递的主机名/ ip地址

解决方案

您可以使用 SendAsync 编写扩展方法。

  public static class MyExtensions 
{
public static Task< PingResult> SendTaskAsync(此Ping ping,字符串地址)
{
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;得到; }
public PingReply回复{set;得到; }
}
}

现在可以使用它:

  var pingTasks = addresses.Select(address => 
{
返回新的Ping()。SendTaskAsync );
});

var replies = await Task.WhenAll(pingTasks);

StringBuilder pingResultBuilder = new StringBuilder();

foreach(var pingReply in reply)
{
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());


I'm pinging hosts from list of strings (addresses). Everything works perfectly but when host is unreachable ping returns Result.Address: "0.0.0.0" instead of existing address or hostname which I passed into SendPingAsync function. Here is my code:

            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());

I found solution here but I need to do the same thing in SendPingAsync function instead of SendAsync. How can I retrieve passed host name / ip address from pingReply.Result?

解决方案

You can write an extension method using 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; }
    }
}

You can now use it like:

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());

这篇关于从SendPingAsync结果检索ping主机名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆