Asynchrone Ping

Lief in ein komisches "problem". Eine Anwendung, die pingsweeps ganze Netzwerke. Funktioniert Super, bis Sie zum Netz mit der netmask 255.255.0.0 (die 65k + Adressen).

Sende ich Ihnen meine pings so:

    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++;
            }
        }

Und erhalten Sie wie folgt:

    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
        }
    }

Problem ist, dass a) Manchmal (sehr selten) das es nicht komplett ist (Bedingung nicht erfüllt). b) Wenn es nicht komplett die zahlen nicht passen? Wenn ich drucken gesendet und empfangen, nur jetzt sind Sie

    Sent: 65025 Recieved: 64990

Trotz das die Bedingung erfüllt ist und die Anwendung wechselt auf? Ich weiß nicht, warum und wie dies geschieht. Ist der code ausführen zu schnell für die Anwendung zu aktualisieren, zwei ints? Einige pings verloren gehen auf dem Weg? Wenn ich versuche, es auf ein Subnetz mit 255 Adressen dieses problem nie passiert.
Verwenden kann CountDownEvent anstelle von Variablen seit seiner .NET 3.5

  • Mein Geld wäre auf thread-Sicherheit. Obwohl es würde die Dinge verlangsamen ein wenig, ich würde konzentrieren Sie sich auf die pingCompleted thread-safe.
  • blöde Frage: warum nicht nmap? Ich Wette, es werden Schnellste Lösung möglich
  • Nicht dumm, ich will lernen, wie es selbst zu tun, so einfach ist das 🙂
InformationsquelleAutor Gvs | 2013-05-31
Schreibe einen Kommentar