从TimedOut Pingreply中获取IP

时间:2017-11-07 11:10:22

标签: c# visual-studio asynchronous ping

我正在ping一个域名列表(介于1000 - 10000之间)并让我的应用程序计算有多少是在线状态,有多少是离线状态。我遇到的问题是我想用Timeout机器的IP地址列出一个列表。有没有办法做到这一点?

public async void PingCompletedMethod(object sender, PingCompletedEventArgs e)
        {
            // Sorts results of ping process 
            PingReply rep = e.Reply;

            try
            {
                if (e.Error != null)
                {
                    // Counts number of unreachable endpoints
                    errorPings++;
                    ErrorPing.Text = Convert.ToString(errorPings);
                    ErrorPing.Background = Brushes.OrangeRed;
                }
                else
                {
                    // Counts Pings that were succesfull 
                    successPings++;
                    SuccessPing.Text = Convert.ToString(successPings);
                }

                // Counts Online/Offline responses
                if (rep.Status == IPStatus.Success)
                {
                    regOnline++;
                    onlineResult.Text = Convert.ToString(regOnline) + " Endpoints Online";
                    onlineResult.Background = Brushes.LightGreen;
                }
                else if (rep.Status == IPStatus.TimedOut)
                {
                    // exportList.Add(Convert.ToString(rep.Address));  
                    regOffline++;
                    offlineResult.Text = Convert.ToString(regOffline) + " Endpoints Offline";
                    offlineResult.Background = Brushes.Orange;
                }
            }
            catch (Exception ex)
            {
                regOffline++;
            }

当我尝试在TimedOut循环下获取rep.Address时,每个条目得到0.0.0.0。如果同样添加到Success循环,我会获得IP。我想要获得TimedOut ping的IP或域名。

这是ping:

foreach (string regOne in regOneList)
            {
                System.Threading.AutoResetEvent autores = new System.Threading.AutoResetEvent(false);
                Ping pingasync = new Ping();
                pingasync.PingCompleted += new PingCompletedEventHandler(PingCompletedMethod);
                pingasync.SendAsync(regOne, 1000);
                autores.WaitOne(1);
            }

先谢谢彼得。

1 个答案:

答案 0 :(得分:0)

您可以将您的域名作为用户状态传递,如下所示:

make

然后在pingasync.SendAsync(regOne, 1000, regOne); 你可以这样得到它:

PingCompletedMethod

旁注:您似乎认为您使用此代码传递超时:

var reg = (string) e.UserState;

但实际上你正在传递数字" 1000"作为用户状态。要通过超时,您需要致电:

 pingasync.SendAsync(regOne, 1000);

默认超时为5秒,因此您当前的代码会使用该超时进行ping操作,而不是您预期的1秒。