【发布时间】:2013-05-31 09:10:23
【问题描述】:
遇到了一个奇怪的“问题”。有一个可以对整个网络进行 ping 扫描的应用程序。在您连接到具有 255.255.0.0 网络掩码(即 65k + 地址)的网络之前效果很好。
我这样发送我的 ping:
foreach (string str in ListContainingAddresses)
{
using (Ping ping = new Ping())
{
if (pingCounter == 10000) { Thread.Sleep(10000); pingCounter = 0; }
//Make an eventhandler
ping.PingCompleted += new PingCompletedEventHandler(pingCompleted);
//Send the pings asynchronously
ping.SendAsync(IPAddress.Parse(str), 1000);
sentPings++;
//This counts pings being sent out
pingCounter++;
}
}
然后像这样接收它们:
public void pingCompleted(object sender, PingCompletedEventArgs e)
{
//This counts recieved addresses
recievedIpAddresses++;
if (e.Reply.Status == IPStatus.Success)
{
//Do something
}
else
{
/*Computer is down*/
}
//This checks if sent equals recieved
if (recievedIpAddresses == sentPings )
{
//All returned
}
}
问题是 a) 有时(很少)它没有完成(条件不满足)。 b) 当它完成时,数字不匹配?如果我刚刚打印发送和接收它们是
Sent: 65025 Recieved: 64990
尽管如此,满足条件并且应用程序继续运行?我不知道为什么以及如何发生这种情况。应用程序更新两个整数的代码是否执行得很快?是否有一些 ping 在途中丢失?如果我在具有 255 个地址的子网络上尝试它,则永远不会发生此问题。 不能使用 CountDownEvent 而不是变量,因为它的 .NET 3.5
【问题讨论】:
-
我的钱会花在线程安全上。尽管它会使事情慢一点,但我会专注于使 pingCompleted 线程安全。
-
愚蠢的问题:为什么不使用
nmap?我敢打赌这将是最快的解决方案 -
一点都不傻,我想自己学,就这么简单:)
标签: c# events asynchronous ping