Laden...

Abfrage Clients mit GetListeningIPs

Erstellt von JensWa vor 2 Jahren Letzter Beitrag vor 2 Jahren 426 Views
J
JensWa Themenstarter:in
11 Beiträge seit 2022
vor 2 Jahren
Abfrage Clients mit GetListeningIPs

Hallo an alle!

Ich habe eine Frage zu GetListeningIPs(). Diese Methode stammt aus SimpleTCP;. Mit der dll lassen sich kleinere Netzwerkanwendungen schnell realisieren.

Mit meinem Code:


var alleclientip1 = meinserver.GetListeningIPs().Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
            alleclientip = alleclientip1.ToList();
            for (int i=0;i<anzahl;i++)
            {
                try
                {
                    textBox_status.AppendText((alleclientip[i].ToString() + "\r\n\r\n"));
                }
                catch (Exception ex) { }
            }
            for (int i = 0; i < 23; i++)
            {
                try
                {

                    for (int j = 0; j < 23; j++)
                    {
                        if (alleclientip[i].ToString() == beschriftung[j, 2].Text)
                        {
                          //  textBox_status.AppendText(alleclientip[i].ToString() + beschriftung[j, 2].Text + "grün \r\n\r\n");
                            beschriftung[j, 1].BackColor = Color.Green;
                        }
                        else
                        {
                            beschriftung[j, 1].BackColor = Color.Red;
                            // textBox_status.AppendText(alleclientip[i].ToString() + beschriftung[j, 2].Text + "rot");

                        }
                    }
                }
                catch (Exception ex)
                { }

Will ich kontrollieren, welche Clients noch am Server hören. Alle verbundenen sollen grün sein, alle, die nicht mehr da sind rot.
Dies klappt eigentlich auch. Aber es werden nur die IPs direkt nach dem Serverstart angezeigt. Kommen neue dazu oder gehen welche weg, dann werden dieses nicht entsprechend ausgewertet. Das heißt geht ein Client weg, dann bleibt er in der Liste, kommt einer dazu, dann fehlt er. Die Anzahl frage der Clients frage ich vorher ab. Das funktioniert, hier ändert sich die Zahl. Die Textbox war nur zur Kontrolle.

Hat jemand eine Idee, an welcher Stelle ich noch etwas ändern kann?

Besten Dank Jens

2.078 Beiträge seit 2012
vor 2 Jahren

Warum merkst Du dir nicht die Liste und aktualisierst sie regelmäßig?
Dass der Client sich abmeldet, darauf kannst Du jedenfalls nicht bauen.

Ach und diese leeren catches - gewöhn dir das ab, ganz schnell. Fehler gehören vorher geprüft und entsprechend behandelt.
Und wenn das leere catch tatsächlich sinnvoll ist, dann gehört da wenigstens ein Kommentar mit einer ausführlichen Begründung rein, warum es leer ist - und ggf. ein Log.
Glaub mir, Du willst nicht erleben, was daraus wird, wenn so eine Anwendung länger so weiter entwickelt wird ...

16.806 Beiträge seit 2008
vor 2 Jahren

Ob ein Client noch existiert kann man einzig und allein über Pings und Timeouts feststellen.
Es gibt keine Garantie, dass ein Client sagt, dass er sich verabschiedet.

Wenn es eine reine TCP Lernaufgabe ist, dann kann man das schon so machen.
Wenn man das professioneller in eine Anwendung einbetten will, dann lieber mit Frameworks wie zB. mit https://docs.microsoft.com/de-de/aspnet/signalr/overview/getting-started/introduction-to-signalr, das sowas wie aktuelle Client-Listen, Security, Pings, Timeouts, Auto-Reconnects eingebaut hat.

J
JensWa Themenstarter:in
11 Beiträge seit 2022
vor 2 Jahren

Hallo,

besten Dank für die schnelle Antwort.

Palladin007: ich habe diese Routine in einem Time-Objekt drin und frage dies aller 3 s ab. Try: Ja, ich baue das gern während der Programmierung ein, um erstmal Fehlerignorieren zu können. (Ist vielleicht nicht okay) Mein Ziel ist es eigentlich in Zukunft darauf ganz zu verzichten.

@Abt. Danke werde mich reinarbeiten.

Viele Grüße
Jens

J
JensWa Themenstarter:in
11 Beiträge seit 2022
vor 2 Jahren

Hallo,

ich habe es jetzt so geklärt. Sieht mir etwas umständlich aus, aber es geht. Der Client sendet einmal in der Minute einen String (Hostname). Die Uhrzeit der letzten Meldung wird gespeichert.
Nun vergleiche ich die aktuelle Zeit mit der gespeicherten Zeit. Ist die größer als eine Minute, dann wird das Feld rot.


 aktuelle_Zeit_String = aktuelle_Zeit.ToString("HH:mm");
                string gespeicherte_zeit = beschriftung[0, 4].Text;
                int Stunden = DateTime.Parse(aktuelle_Zeit_String).Hour - DateTime.Parse(gespeicherte_zeit).Hour;
                int Minuten = DateTime.Parse(aktuelle_Zeit_String).Minute - DateTime.Parse(gespeicherte_zeit).Minute;
                int Zeit_vergangen = Stunden * 60 + Minuten;

Viele Grüße
Jens

4.931 Beiträge seit 2008
vor 2 Jahren

Außerdem kann man deinen Code sehr vereinfachen: in aktuelle_Zeit steht doch schon die Zeit, daher brauchst du doch diese nicht als String erzeugen, um sie dann wieder mit Parse zurück zu konvertieren (und auch gespeicherte_zeit solltest du als DateTime(Offset) speichern.

190 Beiträge seit 2012
vor 2 Jahren

Hallo JensWa,
deine Zeitrechnerei sieht ja gruselig aus.
Um zwei Zeiten zu subtrahieren schau dir das mal an:
DateTimeOffset.Subtract Methode/DateTime.Subtract Methode.
Man kann aber auch das verwenden: Stopwatch Klasse
Bei beiden Varianten kommt das raus: TimeSpan Struktur
Und damit kann man auch schön rechnen und vergleichen.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

2.078 Beiträge seit 2012
vor 2 Jahren

Um zwei Zeiten zu subtrahieren schau dir das mal an:

Oder einfach der Minus-Operator 😉

J
JensWa Themenstarter:in
11 Beiträge seit 2022
vor 2 Jahren

Danke für die Infos,

habe ich korrigiert.

Viele Grüße
Jens