Watchdog für die Anmeldung von Clients
-
Hallo,
da ich neu in diesem Forum bin, hoffe ich, dass ich den richtigen Bereich getroffen habe.
Mein erste Frage die ich habe ist...
Ich möchte einen Watchdog, möglichst unter Linux, programmieren der es registriert, wenn sich Clients übers Netzwerk anmelden (z.B. einfache TCP/IP Anmeldung).
das ganze soll mit Threads oder Mutex oder ähnlichen Dingen realisiert werden.Die Frage ist zwar erstmal rech allgemein, aber ich hoffe für den Einstieg reicht es erstmal.
Danke schon mal im Voraus
-
das reicht leider nicht.
was verstehst du unter "anmelden"? nenn bitte ein beispiel (nur TCP/IP zu nennen, reicht nicht).
-
Ein ganz einfaches Beispiel, vielleicht das Handshake verfahren, oder an einem Socket, der Server muss nur registrieren das der Client da ist, und das eben für mehrere Clients, dann soll ein Timer ablaufen (auf dem Server), so wird registriert ob der Client noch am Leben ist.
-
Vielleicht geht so was mit iptables. Da kann man zumindest eigene Programme/Filter ausführen lassen.
-
Vielleicht sollte man den Thread auch besser in ein anderen Forumsteil verlagern. Ich wollte es zwar auf Posix beziehen, aber mit boost ist das Threading vielleicht auch unter Windows ganz gut möglich. Es wäre also schön, wenn es nicht zu einseitig betrachtet wird.
Danke
-
Dein Problem ist ja wohl nicht das Threading, oder?
Die große Frage ist, was genau Du machen möchtest, was Du im ersten Post beschreibst, würde ich nämlich anders lösen, als das im zweiten Post.
Gib uns eine genauere Beschreibung, was Du wofür machen möchtest, nicht so sehr, wie Du glaubst, dass man das lösen kann, dann können wir Dir bessere Antworten geben.
-
Also, wie gesagt, ein Server soll kontrollieren, ob Clients Lebenszeichen über das Netzwerk an ihn selbst senden. Die Intervallzeit für die Clients soll individuell einstellbar sein. Die Verwalltung soll zentral gelöst werden. UNd wenn der Client kein Lebenszeichen von sich gibt und die Intervallzeit abgelaufen ist, kann man den Client löschen.
Wie gesagt, die Lösung kann unter Linux oder unter Windows erfolgen. Muss jedoch mit Threads, Prozessen, Mutx, CondVar oder ähnlichem realisiert werden.
Nochmals danke für euere Bemühungen.
-
ich hasse phpbb... jetzt hab ich einen beitrag geschrieben und er taucht nicht auf. also noch mal das ganze...
deine frage richt nach hausaufgabe...
du schreibst zwei anwendungn: eine für die clients, eine für den server. die client anwendung schickt alle x sekunden ein udp paket an die server anwendung.
in der server anwendung hast du eine liste. jeder eintrag der liste enthält eine id für den client (zb. die ip adresse) und die zeit, an der das letzte udp paket für diesen client angekommen ist.
sobald ein udp paket ankommt, suchst du anhand der client id den passenden listeneintrag (zb. durch durchlaufen der ganzen liste oder per hashtabelle mit der client id als schlüssel), entfernst den eintrag aus der liste, passt die zeit in diesem eintrag an und fügst den eintrag an das ende der liste an.
ein zweiter thread durchläuft die liste von vorne nach hinten und löscht dabei alle enträge raus, bis er zu einem eintrag kommt, für den das timeout noch nicht abgelaufen ist (prüfbar anhand der zeit im eintrag). bei diesem bricht er ab, schläft für y sekunden und beginnt dann wieder mit dem durchlaufen.du hast dann prozesse, threads und einen mutex (zum schutz der liste) verwendet. eine condition braucht man für diese lösung nicht. ich hoffe, dass dir das hilft.
-
Erstmal danke für deine Antwort...
Also mit der Hausaufgabe hast du schon mal recht, bin aber wie gesagt leider in der Programmierung nicht zu Hause, deswegen wende ich mich mit diesem Problem hier her.Mein erste Frage, gibt es denn bei diesem boost Paket auch eine Liste, oder muss ich die unter c++ komplett neu schreiben, könnte ich das evtl. auch mit einem Array machen, es gibt ja nicht soviel Einträge oder? Ist vielleicht nicht die eleganteste Lösung aber geht vielleicht schneller?
Meine zweite Frage, wie muss ich die Threads starten, damit sie sich nicht gegenseitig beim berabeiten der Liste (Array) stören?
Und warum unterbricht er bei dem ersten Client bei dem der Timer noch nicht abgelaufen ist?
Und wo genau finde ich den Mutex wieder?
Danke schon mal vorab.
-
Du kannst natürlich fertige C++-Typen verwenden, std::map mit der Client-ID als Schlüssel bietet sich in der Tat an. Den Mutex verwendest Du, damit sich die zugreifenden Threads nicht gegenseitig in die Quere kommen, lies die Details am besten einfach nach. (Wikipedia: Mutex)
Und ich würde der Einfachheit halber nicht UDP sondern TCP verwenden, um die Lebenszeichen zu verschicken, aber das ist Geschmackssache. Du könntest zB auch den Server beim Client anfragen lassen, ob er noch lebt, dann tust Du Dir mit Änderungen der Lease-Zeit ein bisschen einfacher.
Edit: Vermaledeite ubb-Tags.
-
Std::map sagt mir jetzt leider nicht viel, wie gesagt, ich tu mich mit C++ etwas schwerer als mit Java.
Und ob ich UDP oder TCP verwende das ist eigentlich egal, die hauptsacheist, dass ich eine Anwendung auf die Beine stelle die Nachrichten sendet und die Nachrichten empfängt.
Und wenn der Timer abgelaufen ist, dann soll natürlich auch der Server beim Client anfragen, das wäre das Optimum...Der Mutex kontrolliert sozusagen die Aktivität der beiden Threads?
-
Du darfst ruhig Google benutzen, ist nicht verboten.
std::map ist die Map-Implementierung der C++-Standardbibliothek, in Java verwendet man dafür idR HashMap.
Und wie das mit den Mutexes und Semaphoren und so funktioniert, musst Du wohl nachlesen, Deine Lücken sind doch recht groß.
-
Danke, aber ich dachte ein Forum ist dazu da um Fragen zu stellen, oder?
-
Ja, _konkrete_ Fragen, aber Du willst Dinge erklärt bekommen, die Du besser in einem Buch oder Wikipedia oder sonstwo nachliest.
Das ist alles Grundlagenwissen, das Du Dir leicht mit ein bisschen Recherche + Lesen aneignen kannst.
-
Na ich werde mal auf deine Hinweise eingehen, und mein Wissen in diese Richtungen ein wenig auffrischen, und dann darauf zurückkommen.
Wie gesagt mir gehts im wesentlich darum wie ich das unter C++ programmieren kann...
-
http://www.cppreference.com/ für std::map
http://www.pronix.de/pronix-6.html für daemons (die bauchst du für die server UND die client anwendung), threads udn netzwerkprogrammierung.ich hoffe, du hast viel zeit
-
Was heißt viel Zeit, meinst du es reichen 2 Wochen um ein erstes Ergebnis zu liefern?
-
kommt drauf an, wie schnell du lernst. ich mein aber eher, dass es keine zwei stündige geschichte am sonntag nachmittag ist.
-
Also wie gesagt,ein paar Grundlagen sind ja da, nur leider hatte ich bisher nicht viel mit C++ gemacht, und wenn dann programmiere ich eigentlich auch nur nebenbei und das unter Java. Nur muss eben noch diese Entwurfarbeit abgeben...
Hab auch ein paar Stunden am Tag Zeit dafür, das heißt die nehme ich mir, nur würde halt gerne gezielt Wissen aufnehmen, deswegen auch meine Frage nach bestimmten Links etc..