从 TimedOut Pingreply 中获取 IP
Getting IP out of TimedOut Pingreply
我正在 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。如果将相同的内容添加到成功循环中,我将获得 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);
}
在此先感谢彼得。
您可以像这样将您的域名作为用户状态传递:
pingasync.SendAsync(regOne, 1000, regOne);
然后在PingCompletedMethod
中可以这样得到:
var reg = (string) e.UserState;
旁注:您似乎认为您正在使用此代码传递超时:
pingasync.SendAsync(regOne, 1000);
但实际上您传递的是数字“1000”作为用户状态。要传递超时,您需要调用:
pingasync.SendAsync(regOne, 1000, null);
默认超时为 5 秒,因此您当前的代码会根据该超时执行 ping 操作,而不是您预期的 1 秒。
我正在 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。如果将相同的内容添加到成功循环中,我将获得 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);
}
在此先感谢彼得。
您可以像这样将您的域名作为用户状态传递:
pingasync.SendAsync(regOne, 1000, regOne);
然后在PingCompletedMethod
中可以这样得到:
var reg = (string) e.UserState;
旁注:您似乎认为您正在使用此代码传递超时:
pingasync.SendAsync(regOne, 1000);
但实际上您传递的是数字“1000”作为用户状态。要传递超时,您需要调用:
pingasync.SendAsync(regOne, 1000, null);
默认超时为 5 秒,因此您当前的代码会根据该超时执行 ping 操作,而不是您预期的 1 秒。