Laden...

einen Timeout timer in einer Klasse einbauen.

Erstellt von Kostas vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.846 Views
K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 17 Jahren
einen Timeout timer in einer Klasse einbauen.

Hallo zusammen,

über eine TCP-Client connection bekomme ich Daten die ich in einer
Klasse schreibe. Umgekehrt, sendet die Klasse über die bestehende
connection etwas zum Client und erwartet innerhalb einer bestimmten Zeit
eine Antwort vom Client. Kommt keine Antwort, soll die Objektinstanz die
connection zum Client trennen.
Die Frage ist jetzt, wie kann ich bitte in der Klasse einen Timeout Timer einbauen?
Ich möchte nicht ein Timer auf das Form legen und diesen Konfigurieren,
weil jede Objektinstanz je einen eigenen Timer haben soll. Der Hintergrund
ist, das es mehrere Clients gibt die sich auf dem Server anmelden.

Wie geht das bitte? Des Weiteren würde mich interessieren ob es
Probleme geben kann wenn im Speicher bis zu 50 Uhren ticken.

Gruß Kostas

M
33 Beiträge seit 2006
vor 17 Jahren

Ich würds einfach so machen (Ablauf):

  1. Daten an Client senden
  2. Timeout für Socket setzten (jede Verbindung mit einem Client hat ja einen eigenen)
  3. mit diesem Socket auf die Antwort warten (try{...}catch[...})
    4a) wenn die Exception für Timeout auftritt -> Fehlerbehandlung, je nach dem was du tun willst
    4b) Falls kein Fehler -> weiter machen

Ich hoffe das Hilft dir.

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 17 Jahren

Hi Markus09,

ach, zu Dumm. Ich hätte erwähnen sollen das ich eigentlich zwei
Timer benötige. Einen für das senden und empfangen der nachrichten,
und einen um die connection zu überwacht. Der Client sendet periodisch
zum Server ein Lebenszeichen(string) wenn nach einer Ablaufzeit nichts
zum senden da war. Sobald irgend etwas von Client kommt, würde ich
den Timer zurückstellen. Somit weis der Server welche Clientconnection
nicht mehr benötigt wird.

Ich glaube ich benötige schon einen Timer in der Klasse.
Benutzt wird von mir die Kombination TCPListener und TCPClient. Ist Dir
zufällig bekannt wie ich den Socket Timer dafür konfigurieren kann?

Ich würde dann den Sockettimer für die Sende-/Empfangspackete
verwenden und den Timer in der Klasse um die connection zu überwachen.

[edit] Habe soeben in der Hilfe System.Timers.Timer(); gefunden.
Ist eine normale Klasse die ein einfach in meiner Klasse einbinden kann.
Über den Sockettimer habe ich leider nicht gefunden.

Gruß Kostas

K
71 Beiträge seit 2005
vor 17 Jahren

Hallo

Wieso sollen denn die "Inaktiven Verbindungen" weiter bestehen (das mit dem Lebenszeichen)?

Ist folgender Ablauf nicht besser?

  • Verbindung aufbauen

  • Datentransfer

  • Verbindung abbauen

  • Bei Bedarf später wiederholen

Oder hab ich das jetzt falsch verstanden? 🙂

Gruss Fellmer

K
Kostas Themenstarter:in
597 Beiträge seit 2005
vor 17 Jahren

Hallo Fellmer Lloyd,

möglicherweise ist es auch nicht richtig was ich da mache, bin für jeden
Hinweis dankbar.

Der Kern der TCP-Kommunikation ist vom Programierhans hier im Forum.
Der TCPListener hört auf einen Port. Sobald ein Client sich anmeldet, wird
die connection erstmal akzeptiert und in einer Hashtable abgelegt.
Der Client sendet nach dem Anmelden seine Signatur. Die Client connection
bleibt offen damit ich auch später mit dem Client kommunizieren kann.

Wenn jetzt der Client seinen Stromstecker zieht, merkt das der Server nicht.
Obwohl die client connection noch offen und in der Hashtable ist.

Ich habe keine Möglichkeit gefunden das der Server automatisch
benachrichtigt wird wenn der Client nicht mehr da ist. Es gibt wohl eine
wenn man direkt über Sockets die Kommunikation programmiert.
Aber da bin ich Lichtjahre davon entfernt. 🙂

Es soll jetzt zwei Stellen geben wo die client connection geschlossen wird,
und aus der Hashtable verschwindet:
Anmerkung: der Client sendet ohnehin schon periodisch Packete zum Server!

  1. Der client meldet sich mit der gleichen (unique) Signatur
    am server an. Die neue connection wir in der hashtable eingetragen
    und zugleich die alte aus ihr entfernt.
  2. Der client hat sich seit x Minuten nicht mehr gemeldet. Die client
    connection soll beendet werden und aus der Hashtable über den
    Timer entfernt werden.

Nur sehr vereinfacht dargestellt. Der Timer setzt auch entsprechende Flags
u.s.w.

Gruß Kostas