Werbung

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Unterschiedliche Adressen "gleichzeitig" anpingen

Dieses Thema im Forum ".NET Technology / C#" wurde erstellt von Mario, 8. Februar 2014.

  1. Mario

    Mario New Member

    Hallo zusammen,

    ich habe versucht ein Programm zu schreiben, was mehrere Adressen gleichzeitig anpingen kann.
    Leider habe ich noch Probleme mit dem Asynchronen senden des Pings.
    Mein "geklauter" Code sieht jetzt so aus:

    Code (C#):
    Quelltext kopieren
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Net.NetworkInformation;
    8. using System.Text;
    9. using System.Threading;
    10. using System.Threading.Tasks;
    11. using System.Windows.Forms;
    12.  
    13. namespace Ping_WinForm
    14. {
    15.     public partial class Form1 : Form
    16.     {
    17.         public Form1()
    18.         {
    19.             InitializeComponent();
    20.         }
    21.  
    22.         AutoResetEvent waiter = new AutoResetEvent(false);
    23.      
    24.  
    25.         private void cmdStart_Click(object sender, EventArgs e)
    26.         {
    27.             string [] ip;
    28.             int i = 0;
    29.             Ping pingSender = new Ping();
    30.  
    31.             // Sobald das PingCompleted Ereignis ausgelöst wird,
    32.             // wird die Methode PingCompletedCallback aufgerufen.
    33.             pingSender.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback);
    34.  
    35.             // Erzeuge einen Puffer mit der Länge von 32 Bytes
    36.             // die versendet werden sollen.
    37.             string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    38.             byte[] buffer = Encoding.ASCII.GetBytes(data);
    39.  
    40.             int timeout = 12000;
    41.  
    42.             PingOptions options = new PingOptions(64, true);
    43.  
    44.             ip = txtPingIp.Text.Split(';');
    45.  
    46.             do
    47.             {
    48.                 foreach (string s in ip)
    49.                 {
    50.                     pingSender.SendAsync(s, timeout, buffer, options, waiter);
    51.                     waiter.WaitOne(1000);
    52.                 }
    53.  
    54.                 if (!chkEver.Checked)
    55.                     i++;
    56.  
    57.             } while (i < 1);
    58.  
    59.         }
    60.  
    61.         private void PingCompletedCallback(object sender, PingCompletedEventArgs e)
    62.         {
    63.             // Falls die Operation beendet wurde, zeige dem Benutzer eine Nachricht.
    64.             if (e.Cancelled)
    65.             {
    66.                 lblInfo.Text += " ping beendet\n";
    67.  
    68.                 // Lasse den main Thread weiterlaufen. UserToken ist
    69.                 // das AutoResetEvent Objekt auf das der main Thread wartet.
    70.                 ((AutoResetEvent) e.UserState).Set();
    71.             }
    72.  
    73.             // Falls ein Fehler aufgetreten ist, zeige die Ausnahme an.
    74.             if (e.Error != null)
    75.             {
    76.                 lblInfo.Text += " Ping failed:";
    77.              
    78.                 lblInfo.Text += (e.Error.ToString() + "\n");
    79.  
    80.                 // Lasse den main Thread weiterlaufen.
    81.                 ((AutoResetEvent) e.UserState).Set();
    82.             }
    83.  
    84.             PingReply reply = e.Reply;
    85.  
    86.             DisplayReply(reply);
    87.  
    88.             // Lasse den main Thread weiterlaufen.
    89.             ((AutoResetEvent) e.UserState).Set();
    90.         }
    91.  
    92.  
    93.  
    94.         private void DisplayReply(PingReply reply)
    95.         {
    96.             if (reply == null)
    97.                 return;
    98.  
    99.             lblInfo.Text += " ping status " + reply.Status;
    100.             if (reply.Status == IPStatus.Success)
    101.             {
    102.                 lstOutput.Items.Add("Address: " + reply.Address.ToString());
    103.                 lstOutput.Items.Add("RoundTrip time: "+ reply.RoundtripTime);
    104.                 lstOutput.Items.Add("Time to live: "+ reply.Options.Ttl + " ms");
    105.                 lstOutput.Items.Add("Don't fragment: "+ reply.Options.DontFragment);
    106.                 lstOutput.Items.Add("Buffer size: "+ reply.Buffer.Length);
    107.             }
    108.         }
    109.     }
    110. }
    111.  
    Mein Problem ist jetzt, wenn ich das ganze in einer Endlosschleife laufen lasse, blockiert die Form und ich kann das Pingen natürlich auch nicht mehr beenden. Z.B. mit einem Klick.
    Wenn jemand verbesserungsvorschläge zu dem hier hat, wäre ich natürlich auch dankbar!
    Code (C#):
    Quelltext kopieren
    1.   do
    2.             {
    3.                 foreach (string s in ip)
    4.                 {
    5.                     pingSender.SendAsync(s, timeout, buffer, options, waiter);
    6.                     waiter.WaitOne(1000);
    7.                 }
    8.  
    9.                 if (!chkEver.Checked)
    10.                     i++;
    11.  
    12.             } while (i < 1);
    Danke euch! :)


    Edit: Übrigens ist die Endlosschleife für die Analyse gedacht und das Protokolliere ich in einer Textdatei.
    Zuletzt bearbeitet: 10. Februar 2014
  2. coding-board

    coding-board Member

    Werbung
  3. gh0st

    gh0st New Member

    Moin Moin,

    also ich persönlich arbeite bei soetwas gern mit Delegaten, ist recht simpel wenn man das Prinzip einmal verstanden hat.

    Code (C#):
    Quelltext kopieren
    1. public class MeineAsynchroneKlasse
    2. {
    3.    private delegate void Handler_für_Endlosschleife();
    4.   private static bool IstSchleifeAktiv = false;
    5.   public void Endlosschleife_Beginnen()
    6.   {
    7.   IstSchleifeAktiv = true;
    8.   Handler_für_Endlosschleife Handler =
    9.   new Handler_für_Endlosschleife(this.Schleife_Abarbeiten);
    10.   Handler.BeginInvoke(new AsyncCallback(this.Schleife_Zu_Ende), Handler);
    11.   }
    12.  
    13.    private void Schleife_Abarbeiten()
    14.   {
    15.   while(IstSchleifeAktiv)
    16.   {
    17.   // Etwas tun
    18.   System.Threading.Thread.CurrentThread.Join(100);
    19.   }
    20.   }
    21.   private void Schleife_Zu_Ende(IAsyncResult ar)
    22.   {
    23.   (ar.AsyncState as Handler_für_Endlosschleife).EndInvoke(ar);
    24.   }
    25.   public void Endlosschleife_Beenden()
    26.   {
    27.   IstSchleifeAktiv = false;
    28.   }
    29. }
    30.  
    Wenn du aus der Schleife einen Wert mit bspw. einem Event rausgibst und in der Form verwenden willst, solltest du dir die System.Windows.Forms.Control.InvokeRequired Eigenschaft etwas genauer ansehen ;)
  4. Mario

    Mario New Member

    Danke für deine Hilfe. Ich habe das ganze jetzt in einem eigenen Thread realisiert. Hätte aber noch eine verständnisfrage zur asynchronen Programmierung:

    Wird durch asynch Programmrierung die Form ebenfalls geblockt?

    Ich habe das jetzt so verstanden:

    Code (C#):
    Quelltext kopieren
    1. {
    2. //CODE
    3.  
    4. //Ich rufe hier meine asynch methode auf
    5.  
    6. //hier wird der code weiter ausgeführt obwohl meine asynch
    7. //methode noch läuft
    8. }
    9.  
    10. asynch methode
    11. {
    12. //CODE
    13. }
    14.  
    Hier würde dann einfach meine Mehtode weiterlaufen und nicht warten bis der asynch Mehtodenaufruf abgeschlossen ist um nicht darauf warten zu müssen, aber die Form würde trotzdem Blockieren.

    Oder habe ich das falsch verstanden?
Die Seite wird geladen...
Ähnliche Themen - Unterschiedliche Adressen gleichzeitig Forum Datum
Unterschiedliche Ergebnisse bei gleicher Formel C/C++ 28. Oktober 2017
SammelContainer für Objekte unterschiedlicher Klassen erstellen C/C++ 7. Mai 2016
Ajax Ready/Load Function - Unterschiedliche Stylesheets JavaScript 7. September 2013
Assembler - Reaktion auf unterschiedliche Zahlen Algorithmen und Datenstrukturen 27. Juni 2013
Progressbar mit unterschiedlicher geschwindigkeit JavaScript 19. Dezember 2012