Seite 1 von 1

Diagnose Tool für einen Server

Verfasst: 15. Juni 2009 11:52
von Nailgun
Moin Leude

Also ich arbeite derzeit an einem Client/Server Projekt. Bis jetzt steht soweit alles, ich kann meine Clients miteinander über den Server verbinden und Daten austauschen. Eine andere Möglichkeit ist, dass ein Client einen Dienst des Servers in Anspruch nehmen kann, der als dll dem Server zur Verfügung steht. Soweit so gut.

Jetzt möchte ich ein Tool schreiben mit dem ich den Server administrieren kann. Und da ich ja auf Dienste, die als dll vorliegen, zugreifen kann, hab ich mir gedacht, dass dies eine geeignete Schnittstelle ist. Das heisst ich möchte eine Client schreiben, der sich genau auf diesen Dienst verbindet. Dadurch könnte ich der dll Befehle geben die dann den Server beeinflussen. So jetzt zu meinem Problem :-)
Mein Server hat nur eine Liste der verbunden Clients und da die Clients in einem eigenen Thread laufen, bekommt der Server auch nicht viel von ihnen mit. Dass ich das mit der dll machen kann, brauche ich aber eine zentrale Stelle die Informationen über die CLients enthält. Ich hoff ihr versteht wie ich das meine. Habt ihr nen Tipp für ne Struktur wie ich das anfagen könnte?

mfg Chris

Verfasst: 15. Juni 2009 13:13
von franzf
Dein Client muss ja erstmal wissen, was der Server alles an Erweiterungen anbietet. Da sich das eigentlich ohne Vorwarnung ändern kann, muss der Client eine Möglichkeit besitzen, die Erweiterungen abzufragen. Da der Client schlecht auf das Dateisystem des Servers zugreifen kann, um sich mal selber schnell die DLLs zu laden, muss das auch über das Netzwerk passieren. Z.B. kannst du nach dem Connect zum Server anfragen was alles da ist. Und der Server antwortet mit eine vollständigen Auflistung, z.B. als XML.

Das nächste: In wie weit kann der Client überhaupt was mit den Erweiterungen anfangen? Da muss doch bereits beim Programmieren des Clients klar sein, welche Features des Server möglich sind?

Und zu guter letzt: Bastel dir eine einfache Schnittstelle. Eine QThread-Instanz ist auch nur ein normales Objekt, dem du Fantasievolle Methoden geben kannst. Diese erledigen halt dann im Hintergrund die Abfragen an den Client über Netzwerk.
Und weil ein QThread auch noch ein QObject ist, kannst du auch mit SIGNAL/SLOT arbeiten, und für Befehle, die der Client dem Server(-Thread) schickt SIGNALS emittieren, die dann die "eigentliche Serverkomponente" in nem SLOT abarbeitet, und dann den Thread über dessen public-API steuert, was wiederum in einem Befehl des Server zum Client resultiert.

Verfasst: 15. Juni 2009 13:42
von Nailgun
hey franzf
also das mit den diensten funktioniert so:
ein client kann beim anmelden am server sagen welche dll er benutzen will, wenn diese vorhanden ist, gilt die verbindung zwischen client und dll als aufgebaut. gibt es die gewünschte dll nicht, so wird auch die verbindung nicht aufgebaut.

die funktionsweise sieht folgendermasen aus:
steht die verbindung zwischen client und dll, dann wird alles was vom client geschickt wird an die dll weitergeleitet. die dll verarbeitet das zeug und legt das ergebnis auf der platte ab. von kann es sich der client wieder abholen. jede dll ist ja vom gleichen interface, und hat nur eine funktion. was die funktion macht is ja wieder von dll zu dll unterschiedlich. gleich ist nur der übergabe und rückgabe parameter.

das was du zuletzt geschrieben hast, hab ich mir auch schon überlegt, ist aber nicht unbediengt dass auf was ich rauswill. das was ich will sieht so in der art aus:
der client verbindet sich zu der monitordll. jetzt kann der client der dll jede nachricht schicken die er will. so eine nachricht könnte zum beispiel eine anfrage über alle verbundenen clients sein. soweit ist es auch kein problem. der client schickt die anfrage an die dll und die dll "weiss" auch was sie damit machen soll. nur hat die dll ja keine ahnung vom server. die dll lade ich über den pluginloader zur laufzeit. ich muss jetzt irgendwie die informationen über den server und dessen clients der dll zur verfügung stellen. und da hab ich grad keine ahnung wie ich das machen soll. weisst vielleicht was?

Verfasst: 15. Juni 2009 23:22
von franzf
Nailgun hat geschrieben:nur hat die dll ja keine ahnung vom server. die dll lade ich über den pluginloader zur laufzeit. ich muss jetzt irgendwie die informationen über den server und dessen clients der dll zur verfügung stellen. und da hab ich grad keine ahnung wie ich das machen soll. weisst vielleicht was?
Zu allererst eine Warnung: QPluginLoader lädt dein Plugin genau EIN MAL! Wenn du also in 2 Threads ein Plugin verwendest, hast du ein Problem!

Desweiteren ist dein Problem absolut trivial! Du kannst nur soviel Infos abrufen, wie dir eine öffentliche API bietet. Willst du von Server die angeschlossenen Clients haben, braucht dein Server eine Methode, mit der eben diese abgefragt werden können. Diese musst du per Mutex absichern, da du ja aus unterschiedlichen Threads darauf zugreifst.
Wie du das löst sei dir überlassen. Die Klasse, die die Infos liefert, als Singleton deklarieren, auf die du dann einfach in deinem Plugin zugreifst.
Oder eben per Setter dem Objekt übergeben, nachdem das Plugin geladen wurde, muss dann natürlich in das Interface deines Plugins aufgenommen werden.

Verfasst: 17. Juni 2009 12:57
von Nailgun
Danke franzf
ich werds mal versuchen.