奇妙な「問題」に遭遇しました。ネットワーク全体を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
それにもかかわらず、条件が満たされ、アプリケーションが続行されますか? なぜ、どのようにこれが起こっているのかわかりません。アプリケーションが 2 つの int を更新するためにコードが高速に実行されていますか? 途中でいくつかの ping が失われますか? 255 のアドレスを持つサブネットワークで試してみると、この問題は発生しません。.NET 3.5以降、変数の代わりにCountDownEventを使用できません