Thread Ausgabe vom Server wird nicht richtig abgeholt
(9 answers)
Opened by Echelon1010000 at 2005-07-08 12:34
Hi
Ich hab hier ein kleines Problem mit dem Abholen von Antworten eines TCP Servers. Der Server gehört zu "lcdproc" einer Anwendung zum Darstellen von Informationen auf einem LCD. Eine Anwendung kann sich via TCP mit dem Server verbinden und über ein Klartextprotokoll Daten übermitteln. Diese werden mit einfachen Befehlen übermittelt die dem Server sagen was er wie und wo auf dem LCD darstellen soll. Der Server unterstützt mehrere sogenannte Screens. Diese Screens repräsentieren eine Displayanzeige und werden in regelmässigen Abständen gewechselt. So ist es zum Beispiel möglich abwechselnd eine Anzeige für die CPU Temperatur und die Lüfterdrehzahl darzustellen. Immer wenn der Server zum nächsten Screen übergeht gibt er eine Meldung an alle verbundenen Clients aus die allen Clients mitteilt wann welcher Screen angezeigt wird. Diese Mtteilung erscheint als Information auf dem Ausgabekanal des Servers und sieht so aus (Angenommen ich hab den Screen "CPU" und den Screen "Luefter": Auf einen erfolgreichen Befehl gibt der Server die Meldung "success" aus, ein fehelerhafter Befehl wird mit der Meldung "Huh? $Fehlermeldung" kommentiert. Ich habe nun mit Perl eine Anwendung geschrieben die Systemdaten einsammelt und auf diesen Screens anzeigt. Das klappt auch eigentlich sehr gut. Bis auf einen kleinen Fehler: Ich habe meine Anwendung so geschrieben das die Informationen über die angezeigten Screens verworfen werden. Informationen über Erfolg/Fehler werden ausgwertet und entsprechend verarbeitet. Die Infonachrichten verwerfe ich weil ich eine Art Echtzeit Anzeige haben möchte und beim Wechsel auf einen neuen Screen nicht die Werte von vor 30 Sekunden da stehen haben will. Die Anzeigen lassen sich auch aktualisieren wenn der Screen im Moment nicht angezeigt wird. So halte ich meine Anzeigen immer aktuell. Wenn also ein Befehl an das LCD abgesetzt wird holt die Anwendung die Rückmeldung vom Server ab. Dann wird geprüft ob es sich um eine Antwort handelt oder um eine Infonachricht. Falls es eine Infonachricht ist wird diese verworfen und die nächste Nachricht abgeholt. Falls es eine "success" oder "huh?" Meldung ist wird entsprechend ein return-Wert ausgegeben. Leider ist es so das die Routine manchmal zwei Nachrichten abholt. Das sieht dann zum Beispiel so aus das die erhaltene Nachricht nicht "listen CPU" lautet sondern Wie man sieht ist es eine Nachricht die sowohl eine Infonachricht enthält als auch eine angehängte Erfolgsmeldung. Die Routine wertet jedoch die Nachricht als eine einzige Info Nachricht und springt zurück um die nächste Nachricht abzuholen. Da kommt nur nichts mehr, die Routine wartet ewig auf die nächste Nachricht, in der Folge hängt das Programm an dieser Stelle. Meine Frage: Wie kann ich das unterbinden das zwei Nachrichten abgeholt werden? Ich möchte als statt der gesamten Ausgabe des Servers immer nur eine Nachricht abholen und diese dann auswerten. Die einzelnen Nachrichten sind so wie es aussieht durch ein "Newline ( \n )" getrennt, gibt es da eine andere Möglichkeit diese abzuholen? Nachfolgend der fragliche Code. Zuerst bispielhaft zwei der Routinen die auf das Display schreiben: Code: (dl
)
1 sub addstring Alle anderen Routinen sehen genauso aus, nur die Befehle die an das Display übermittelt werden sind unterschiedlich. Die sub "getsocket();" ermittelt den passenden Socket auf den geschrieben werden muss da ich mit mehreren Sockets arbeite. Nun die Sub die die Antworten abholt und auswertet: Code: (dl
)
1 sub suck Vielleicht kann mir da jemand helfen? Gruss, Echelon |