Lehrstuhl für Datenverarbeitung Prof. Dr.-Ing. Dr. E.h. Wolfgang Weber Diplomarbeit D341 Entwicklung einer Client-/Server-Applikation zum Informationsaustausch von Systemdaten zwischen entfernten Systemen Durch die zunehmende Vernetzung ist es möglich, die nicht genutzten Ressourcen andere Rechner zu benutzen. Dazu müssen jedoch die Systemdaten bekannt sein. Des weiteren wird ein Sicherheitsrisiko durch Kopplung von Rechnern über ein Netzwerk erzeugt. Durch kontinuierliche Ermittlung der aktuellen Systemdaten und Analyse der aufgenommenen Informationen kann somit ein Rückschluß auf eine mögliche Sicherheitsverletzung bzw. einen Mißbrauch des Systems aufgedeckt werden. Ziel dieser Arbeit ist es nunmehr, zwischen Rechnern einen Informationsaustausch ihrer Systeminformationen zu ermöglichen. Dazu soll eine Client-/Server-Applikation implementiert werden, welche den Datenaustausch über die Protokollfamilie TCP/IP ermöglicht. Die zu entwickelnde Software ist auf allen am Informationsaustausch beteiligten Systemen zu installieren. Es soll ein Algorithmus entwickelt werden, der einen entsprechenden Rechners nicht nur im eigenen, sondern auch in benachbarten und entfernten Netzwerksegmenten erkennt. Die erfaßten Daten sind in Listen zu führen, welche periodisch aktualisiert werden. Um jederzeit ein Überblick der verfügbaren Systeme zu erhalten, soll zwischen den erkannten Rechnern permanent eine automatisierte Synchronisation der Systeminformationen stattfinden. Zu Auswertungszwecken sind die erfaßten Daten in einem geeignete Datenbankformat zusätzlich an jedem Rechner lokal zu sichern. Die Client-/Server-Applikation ist unter MS Windows NT mittels MS Visual C++ zu realisieren. Alle Entwicklungsschritte sind zudem projektbegleitend zu dokumentieren. (Prof. Dr.-Ing. Wolfgang Weber) Bearbeiter: Matrikel-Nummer: Betreuer: Ausgabetag: Abgabetag: cand.-Ing. Volker Schüppel 108 093 216 367 Dipl.-Ing. Thomas Droste 31.03.1999 30.09.1999 Inhalt Inhalt 1 2 Einführung .......................................................................................................... 3 Die Client-/Server-Architektur............................................................................. 4 2.1 Die Peer-to-Peer Architektur............................................................................ 5 2.2 Mischformen ................................................................................................... 6 3 Die TCP/IP Protokollfamilie................................................................................ 7 3.1 Das Internet Protocol ....................................................................................... 7 3.1.1 Die Internet-Protokoll-Adressen ............................................................... 8 3.1.2 Subnetze................................................................................................... 9 3.1.3 Reservierte Adresse................................................................................ 10 3.2 Das Transmission Control Protocol................................................................ 11 3.2.1 Der Protokoll-Kopf ................................................................................ 11 3.2.2 Die Phasen einer TCP-Verbindung......................................................... 14 3.2.3 TCP-Ports............................................................................................... 17 4 Das Domain Name System ................................................................................ 18 4.1 Die Datei hosts .............................................................................................. 18 4.2 Komplexe Netzwerke .................................................................................... 18 4.3 Server-Funktionalität ..................................................................................... 19 5 Pflichtenheft ...................................................................................................... 20 5.1 Zielbestimmung............................................................................................. 20 5.1.1 Mußkriterien .......................................................................................... 20 5.1.2 Wunschkriterien ..................................................................................... 20 5.1.3 Abgrenzungskriterien ............................................................................. 20 5.2 Produkteinsatz ............................................................................................... 20 5.2.1 Anwendungsbereiche ............................................................................. 20 5.2.2 Zielgruppen ............................................................................................ 21 5.2.3 Betriebsbedingungen .............................................................................. 21 5.3 Produktumgebung.......................................................................................... 21 5.3.1 Software................................................................................................. 21 5.3.2 Hardware................................................................................................ 21 5.3.3 Orgware ................................................................................................. 21 5.3.4 Produktschnittstellen .............................................................................. 21 5.4 Produktfunktionen ......................................................................................... 21 5.4.1 Zusammenstellen der eigenen Systemdaten ............................................ 21 5.4.2 Systemdatenaustausch ............................................................................ 22 5.4.3 Datenarchivierung .................................................................................. 22 5.5 Produktdaten.................................................................................................. 22 1 Inhalt 5.5.1 Systemdaten ........................................................................................... 22 5.6 Produkt-Leistungen........................................................................................ 23 5.7 Benutzungsschnittstelle.................................................................................. 23 5.8 Qualitäts-Bestimmung ................................................................................... 23 5.9 Globale Testfälle ........................................................................................... 23 5.10 Entwicklungsumgebung................................................................................. 24 6 Der Scanner....................................................................................................... 25 6.1 Die Host-Erkennung ...................................................................................... 25 6.2 Die Applikations-Erkennung ......................................................................... 26 6.3 Zweistufiges Verfahren.................................................................................. 27 6.4 Parallele Verarbeitung ................................................................................... 28 7 Die Kommunikation mit anderen Rechnern ....................................................... 29 7.1 Das Übertragungsprotokoll ............................................................................ 29 7.2 Der Kommunikationsablauf ........................................................................... 31 8 Das Programm Systemdetector .......................................................................... 33 8.1 Der Programmablauf ..................................................................................... 33 8.1.1 Der Programmstart ................................................................................. 33 8.1.2 Der Ablauf der Ausführungspfade .......................................................... 37 8.2 Die Dialogfelder ............................................................................................ 43 8.2.1 Der Hauptdialog ..................................................................................... 43 8.2.2 Der Details-Dialog ................................................................................. 45 8.2.3 Der Optionen-Dialog.............................................................................. 46 8.2.4 Der About-Dialog ................................................................................... 47 8.3 Die Ausgabedatei........................................................................................... 48 8.4 Die Konfigurationsdatei................................................................................. 49 8.5 Die Objekte der Applikation .......................................................................... 50 8.5.1 Die Strukturen der Applikation............................................................... 51 8.5.2 Die Klassenbeschreibung ....................................................................... 52 9 Tests.................................................................................................................. 55 9.1 Applikationsstabilität prüfen.......................................................................... 55 9.2 Erkennen aller Rechner im Netzwerk............................................................. 57 9.3 Zusammenschluß mehrerer Rechner .............................................................. 59 9.4 Ordentliches Beenden des Programmes ......................................................... 61 9.5 Programmabsturz simulieren ......................................................................... 63 9.6 Netzwerkstörung simulieren .......................................................................... 65 10 Probleme und Ausblick...................................................................................... 67 11 Literatur............................................................................................................. 68 Anhang...................................................................................................................... 70 2 Kapitel 1 Einführung 1 Einführung Die Systemdaten eines Rechners können für den Benutzer eines Systems von großem Interesse sein. Diese Daten geben Aufschluß über verwendete Hard- und Software, Konfiguration und die Leistungsfähigkeit des Systems. Außerdem können nicht genutzte Ressourcen angezeigt werden. Manchmal kann es sinnvoll sein, nicht nur die eigenen Systemdaten zu kennen, sondern auch diejenigen benachbarter Systeme. Beispielsweise könnte durch die Aufnahme der aktuellen Systemdaten ein Rückschluß auf eine mögliche Sicherheitsverletzung des Systems aufgedeckt werden. Um dies zu realisieren ist eine Applikation notwendig, die auf der einen Seite die eigenen Daten ermitteln und auf der anderen Seite mit anderen Systemen kommuniziert, um diese Informationen auszutauschen. Die Applikation muß auf jedem Rechner laufen, der an diesem Informationsaustausch teilnimmt. Die Kommunikation wird mit Hilfe eines bestehenden Netzwerks unter Verwendung der Protokollfamilie TCP/IP realisiert. Der Datenaustausch findet nach dem Prinzip der Client-/Server-Archiktektur statt. Dabei fungiert jeder Rechner auf dem die Anwendung läuft als Server, der die Anfragen der Clients beantwortet. Gleichzeitig besitzt jeder Rechner mehrere Clients, die Serveranfragen an andere Rechner stellen. Bevor ein Datenaustausch zwischen zwei Systemen stattfinden kann, muß den beiden Systemen die gegenseitige Erreichbarkeit bekannt sein. Um ein System im Netzwerk zu finden, auf dem die gleiche Applikation läuft, bedarf es eines Algorithmus, der einen entsprechenden Rechner im Netzwerk erkennen kann. Um die erfaßten Daten ständig zu aktualisieren, muß die sich Kommunikation zwischen den Systemen periodisch wiederholen. Die Daten werden dann auf jedem System in einer Rechnerliste geführt, welche zu Auswertungszwecken in eine Datei exportiert werden. 3 Kapitel 2 Die Client-/Server-Architektur 2 Die Client-/Server-Architektur Es gibt viele Möglichkeiten eine Netzwerk-Applikationen zu implementieren. Trotz dieser vielen Unterschiede zwischen den unterschiedlichen Diensten und Protokollen, lassen sich alle Netzwerk-Programme auf ein einfaches Modell, die Client/ServerArchitektur reduzieren. Jede Netzwerk-Applikation besitzt einen Kommunikations-Endpunkt. Dabei existieren zwei Typen von Endpunkten: Clients und Server. Der Server stellt seine Dienste im Netzwerk bereit. Dies sind im allgemeinen spezielle Anwendungen, die auf eine Verbindungsanforderung warten, um auf diese entsprechend zu antworten. Ein Client nimmt einen Dienst eines Servers in Anspruch, indem er zu diesem Server eine Verbindung initiiert. Dabei geht der erste Kontakt geht immer von einem Client aus (vgl. Abbildung 2-1). Versucht, Verbindung zu öffnen 1. Nimmt Verbindungsgesuch an 2. Client Server Nachrichtenaustausch in beiden Richtungen 3. Abbildung 2-1: Kommunikationsablauf zwischen Client und Server Da die Client-/Server-Architektur auf einem verbindungsorientierten Dienst basiert, bedarf es für die praktische Durchführung die Verwendung eines verbindungsorientierten Protokolls. In TCP/IP-Netzwerken werden Verbindungen mit Hilfe des TCP1 realisiert (vgl. Kapitel 3.2). Durch die Verwendung von Ports werden einem Kommunikations-Endpunkt Anschlüsse zur Verfügung gestellt. Diese werden dazu verwendet, die Netzwerkverbindung zur richtigen Anwendung weiterzuleiten (vgl. Abbildung 2-2). Ein Client bzw. Server verwendet bei seiner Kommunikation mindestens einen Port. Der Server überprüft diese Ports auf eingehende Anfragen und nimmt darauf Verbindungen zu einem Client an. Der Client sendet seine Verbindungsanforderungen über den verwendeten Port. Da ein TCP/IP-Knoten im allgemeinen über 216=65536 verschiedene Ports verfügt, ist es möglich, daß auf einem System mehrere Server, mehrere Clients, oder Mischformen gleichzeitig als Applikation laufen. Dabei ist lediglich zu beachten, daß Ports exklusiv von jeder Applikation verwendet werden müssen (vgl. Kapitel 3.2.3). 1 TCP – Transmission Control Protocol 4 Kapitel 2 Die Client-/Server-Architektur Netzwerkschnittstelle Port 50 Anwendung 1 Port 100 Anwendung 2 Port 1100 Anwendung 3 Abbildung 2-2: Ports Ein typischer Einsatz für einen Server, ist die Verwendung als Fileserver in einem lokalen Netzwerk. Dabei greifen viele Clients auf diesen Dienst des Servers zu (vgl. Abbildung 2-3). Client Client Fileserver Client Client Abbildung 2-3: Fileserver Der Server ist in diesem Fall unter Umständen die herausragende Maschine, welche im allgemeinen aufwendiger und teurer ist. Er stellt den Clients seinen Massenspeicher zur Verfügung, der den einzelnen Clients z.B. fehlt. Hier werden die Vorteile dieser Architektur deutlich. Nur beim Server handelt es sich um eine eventuell aufwendige und teure Maschine. Es können jedoch alle Clients von den Diensten des Servers profitieren. 2.1 Die Peer-to-Peer Architektur Die Peer-to-Peer-Architektur geht einen anderen Weg. Hierbei stellt jeder Knoten des Netzwerks gleichzeitig einen Client und einen Server dar (vgl. Abbildung 2-4). Alle Knoten sind als gleichwertig zu betrachten. Dadurch ist auch der Aufwand, der an jedem Knoten betrieben werden muß gleich groß. Ob dies ein Vorteil oder ein Nachteil gegenüber der eigentlichen Client-/Server-Architektur bedeutet, muß im Einzelfall geprüft werden. 5 Kapitel 2 Die Client-/Server-Architektur Client + Server Client + Server Client + Server Abbildung 2-4: Peer-to-Peer 2.2 Mischformen In den vorangegangenen Strukturen fungierte ein Rechner als Client oder als Server, oder als Client und Server (Peer-to-Peer). Es sind jedoch auch Mischformen möglich, in denen mehrere Client- bzw. mehrere Server-Applikationen auf einem Rechner laufen (vgl. Abbildung 2-5). Client B Client C Server A Client A Client C Server B Client A Client B Server C Abbildung 2-5: 2 Clients / 1 Server In dem Beispiel besitzt jeder Rechner einen Server und zwei Clients. Aus der Sicht eines Rechners besitzt er genau einen Client für jeden anderen Server, um Anfragen zu stellen. Ein Rechner hat aber nur einen Server um Anfragen zu beantworten. Der umgekehrte Fall ist auch denkbar. Dabei besitzt jeder Rechner einen Client, um seine Anfragen zu stellen und mehrere Server, um Anfragen anderer Clients zu beantworten (vgl. Abbildung 2-6). Server B Server A Server C Client A Server C Client B Server A Server B Client C Abbildung 2-6: 2 Server / 1 Client 6 Kapitel 3 Die TCP/IP Protokollfamilie 3 Die TCP/IP Protokollfamilie Im 7 Schichten ISO1-OSI2-Modell (vgl. Tabelle 3-1) ist das Internet Protokoll (IP) auf Ebene 3 und das Transmission Control Protocol (TCP) auf Ebene 4 angeordnet [WAS94]. Schicht Funktion 7 6 5 4 3 2 1 Anwendung Darstellung Kommunikationssteuerung Transport Vermittlung Sicherung Physikalisch Tabelle 3-1: ISO-OSI-Schichtenmodell 3.1 Das Internet Protocol Beim Internet Protocol (IP) handelt es sich um ein verbindungsloses Vermittlungsprotokoll. Es ist für die Übertragung zum richtigen Rechner im richtigen Netzwerk verantwortlich, d.h. die Routenwahl zwischen unterschiedlichen Netzwerken wird durch das IP mitbestimmt. Dabei ist zu beachten, daß das Internet Protokoll ein verbindungsloser Datagramm-Dienst ist. Es muß zwischen dem Sender und dem Empfänger keine Verbindung aufgebaut werden, um Daten zu übermitteln. Der Sender sendet die Daten direkt an den Empfänger, ohne vorher die Erreichbarkeit geprüft zu haben. Der Empfänger sendet keine Empfangsbestätigung für erhaltene IP-Datagramme, wodurch die Übertragung von IP-Datagrammen unsicher und Datenverluste keinesfalls ausgeschlossen werden können. Ein Protokoll der höheren Schichten (z.B. ein Transportprotokoll) muß dann für eine sichere Übertragung sorgen. Bei einer Übertragung auf IP-Ebene ist zwischen zwei Kommunikationsknoten keine spezielle Route definiert, welche die IP-Datagramme durchlaufen müssen. Deshalb ist es möglich, daß die IP-Datagramme zwischen einem Start- und Zielsystem unterschiedliche Routen nehmen und möglicherweise in falscher Reihenfolge beim Em- 1 ISO - International Standard Organization 2 OSI - Open System Interconnection 7 Kapitel 3 Die TCP/IP Protokollfamilie pfänger ankommen. Das Internet Protokoll stellt keine Funktionen bereit, welche die richtige Reihenfolge der Datagramme wieder herstellt. Diese Aufgabe kann ebenfalls nur von einem Protokoll einer höheren Schicht übernommen werden. Das Adressieren und Fragmentieren von Datagrammen und die Ermittlung des passenden TOS (type of service) oder Diensttyps gehören zu den elementaren Funktionen des Internet Protokolls. Die anderen Funktionen bzw. Optionen spielen meist eine untergeordnete Rolle und sind in [STE94] aufgeschlüsselt. 3.1.1 Die Internet-Protokoll-Adressen Die Internet-Protokoll-Adresse hat eine Länge von 32 Bit und ist Teil des InternetProtokoll-Kopfes. Sie beschreibt die Bindung (Schnittstelle) von genau einem Host (Rechner) zu einem Netzwerk. Ein Host mit mehr als einer Schnittstelle zu einem oder verschiedenen Netzwerken besitzt auch mehrere IP-Adressen. Für jede Bindung muß genau eine IP-Adresse vergeben sein. Nur in Ausnahmefällen können zwei Schnittstellen die gleiche IP-Adresse besitzen. Ist ein Host mit mehreren Bindungen ferner in der Lage zwischen diesen Bindungen IP-Datagramme weiterzuleiten, so wird er als IPRouter, Bridge oder Gateway bezeichnet. Die IP-Adressen erfüllen zwei wichtige Aufgaben. Erstens identifizieren sie genau eine Schnittstelle, da sie exklusiv vergeben werden müssen, zweitens identifizieren die IP-Adressen das Netzwerk, in dem diese Bindung vorhanden ist. Die IP-Adresse besteht aus 4 Bytes bzw. 32 Bit, die in 4er Tupel angegeben werden. Jede Zahl kann einen Wert zwischen 0 und 255 annehmen, woraus sich folgende Darstellung ergibt: 134.147.1.1 = 10000110100100110000000100000001 |2 Eine IP-Adresse ist in zwei logische Teile unterteilt. Sie besteht aus der Netzwerknummer und der Hostnummer. Im ersten Teil steht die Netzwerknummer, die Hostnummer befindet sich im zweiten Teil der IP-Adresse. Die Grenzen dieser Adressteile sind abhängig von der Adressklasse (vgl. Abbildung 3-1). Abbildung 3-1: Netz- und Hostteil der Adressklassen 8 Kapitel 3 Die TCP/IP Protokollfamilie Die Klassen A, B und C sind die drei wichtigsten Adressklassen. Die Klassen D und E stehen nicht zur allgemeinen Verfügung und sind nur aufgrund der Vollständigkeit hier erwähnt. Der mögliche Adressbereich ist in Tabelle 3-2 angegeben. Klasse A B C D E Erste Adresse 1.0.0.0 128.1.0.0 192.0.1.0 224.0.0.0 240.0.0.0 Letzte Adresse 127.255.255.255 191.255.255.255 223.255.255.255 239.255.255.255 247.255.255.255 Tabelle 3-2: Adressbereiche der Adressklassen Die IP-Adresse und damit auch die Adressklasse müssen vom jeweiligen Administrator für einen Host eingestellt werden. Es muß beachtet werden, daß alle Adressen exklusiv vergeben werden müssen. Falls das Internet mit neuen Netzen bereichert werden soll, so muß auf Adressen zurückgegriffen werden, die sonst noch niemand verwendet. Die Adressen bzw. die Adressklassen für das Internet werden vom NIC1 eindeutig vergeben. 3.1.2 Subnetze Jedes Klasse A-Netz kann theoretisch bis zu 16 Millionen Hosts beinhalten. Eine Anzahl von 16 Millionen Hosts können aber in der Praxis nicht über ein einziges Übertragungsmedium miteinander kommunizieren. Die Performance, die unter allen Hosts aufgeteilt wird, tendiert praktisch gegen Null. Eine zusätzliche Unterteilung eines Netzwerkes in Subnetze ist erforderlich, was durch die Angabe der Subnetzmaske erreicht wird. Durch die Subnetzmaske kann ein Host feststellen, ob eine Übertragung an einen anderen Host direkt im eigenen Subnetz gesendet werden kann, oder ob die Nachricht über einen Router, welcher die Schnittstelle zu einem benachbarten Netzwerk oder Subnetz darstellt, geleitet werden muß. Mit Hilfe der Subnetzmaske kann ein Host ermitteln, ob sich der andere Host im gleichen Subnetz befindet, oder nicht. Eine Subnetzmaske hat die gleiche Form wie eine IP-Adresse und wird genauso als 4er Tupel gelesen. Die 32 Bit einer Subnetzmaske sind in 3 Teile unterteilt (vgl. Abbildung 3-2). Der Netzwerk- und der Subnetzteil bestehen immer aus „1“en, der Hostteil immer aus „0“en. Entscheidend sind die Grenzen der einzelnen Teile. 1 NIC - Network Information Center 9 Kapitel 3 Die TCP/IP Protokollfamilie Netzwerkteil Subnetzteil Hostteil Abbildung 3-2: Aufbau der Subnetzmaske Bevor ein Sender einem Empfänger ein IP-Paket zusendet, prüft er, ob sich der Empfänger im selben Subnetz befindet, oder nicht. Dies ermöglicht die Subnetzmaske mit Hilfe eines Bitvergleiches. Dazu werden die Bits der Sender- und Empfängeradresse verglichen, die in der Subnetzmaske den Wert „1“ haben. Sender und Empfänger liegen im gleichen Subnetz, wenn die Bits übereinstimmen. Für den Fall, daß die beiden Hosts nicht in einem Subnetz liegen, muß der Sender seine Nachricht an einen IP-Router senden, der diese dann weiterleitet [STE94]. Host A Host B Subnetzmaske Netzwerkteil Subnetzteil Hostteil IP-Adresse 192.168.20.2 192.168.20.254 255.255.255.192 255.255.255.xxx IP-Adresse bitweise ausgeschrieben 11000000101010000001010000000010 11000000101010000001010011111100 11111111111111111111111111000000 111111111111111111111111xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxx11xxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx000000 Tabelle 3-3: Beispiel In dem Beispiel aus Tabelle 3-3 liegen die beiden Hosts im gleichen Netzwerk, da alle Bits der beiden IP-Adressen übereinstimmen, die im Netzwerkteil der Subnetzmaske den Wert „1“ besitzen. Da die Bits im Subnetzteil der beiden Hosts sich unterscheiden, befinden sich die beiden Hosts nicht im gleichen Subnetz. Der Sender muß sein IPPaket zu einem IP-Router senden, der dieses weiterleitet. 3.1.3 Reservierte Adresse Die Adresse 127.0.0.1 ist für die Rückkopplungsschleife (loopback) reserviert. Falls eine Nachricht an die Adresse 127.0.0.1 gesendet wird, ist immer der eigene Host der Empfänger. Der gesamte Adressbereich 127.xxx.xxx.xxx kann keinem Host zugeordnet werden. Die erste und die letzte IP-Adresse in einem Subnetz sind für die Netzwerk- und die Broadcast-Adresse reserviert. Sie dürfen ebenfalls keinem Host zugeordnet werden. 10 Kapitel 3 Die TCP/IP Protokollfamilie 3.2 Das Transmission Control Protocol Beim Transmission Control Protocol (TCP) handelt es sich um ein TransportProtokoll, welches im 7 Schichten-Modell auf Ebene 4 einzuordnen ist (vgl. Tabelle 3-1). Durch das TCP wird die Zuverlässigkeit einer Übertragung auf der IP-Ebene erhöht. Außerdem wird durch den Gebrauch von Port-Nummern die Adressierung von Diensten der Anwendungsschicht ermöglicht. Das TCP ist ein verbindungsorientiertes Protokoll. Es ist erforderlich, daß eine Verbindung zwischen zwei Rechnern eingerichtet wird, bevor Daten übertragen werden können. Nach der Datenübertragung wird die Verbindung wieder getrennt. Die gesteigerte Zuverlässigkeit wird durch folgende Mechanismen erreicht: • Fehler-Erkennung und Fehler-Korrektur • Fluß-Kontrolle • Neuordnung der Übertragung-Sequenzen • Entfernung doppelter Segmente1 Durch die Fehler-Erkennung und Fehler-Korrektur werden die Segmente behandelt, die durch Übertragungsfehler verfälscht übertragen worden sind. Die Flußkontrolle reguliert die Aussenderate des Senders, um einen Datenüberlauf beim Empfänger zu verhindern. Die erhaltenen Sequenzen müssen am Empfänger neu angeordnet werden, da von der IP-Schicht, die TCP-Segmente in beliebiger Reihenfolge übertragen werden können. Dieser Fall tritt häufig auf, wenn die IP-Datagramme unterschiedliche Routen verwendet haben. Durch erneutes Senden (vgl. Kapitel 3.2.2.2) des Senders können doppelte Segmente am Empfänger entstehen. Diese müssen durch die FehlerKorrektur-Mechanismen vom TCP entfernt werden. Es wird folgendermaßen vorgegangen, um diese Funktion in das TCP zu implementieren: • Verwendung von Sequenz-Nummern zur Kennzeichnung der Daten • positive Rückmeldung, wenn Daten in der richtigen Reihenfolge empfangen worden sind • Erneute Sendung von Segmenten, für die innerhalb eines bestimmten Zeitraums keine Empfangsbestätigung eingegangen ist. 3.2.1 Der Protokoll-Kopf Das TCP besitzt einen komplexen Protokoll-Kopf (vgl. Abbildung 3-3). Der Kopf beinhaltet ein Absender- und ein Empfänger-Feld. Die anderen Felder dienen der Steuerung der Kommunikation und der Erhöhung der Zuverlässigkeit. 1 Segmente – Datenblöcke, die vom TCP an das IP übergeben werden 11 Kapitel 3 Die TCP/IP Protokollfamilie Absender-Port Empfänger-Port Sequenznummer Bestätigungsnummer Daten-Offset Reserviert Code Fenster Prüfsumme Dringlichkeitszeiger Optionen Füllzeichen Daten Abbildung 3-3: TCP-Protokollkopf 3.2.1.1 Die Sequenznummer Die Sequenznummer im Steuerkopf eines Segments gibt an, an welcher Position sich das erste Oktett dieses Segments im Datenstrom befindet. Wird eine neue TCPVerbindung initialisiert, so tauschen Sender und Empfänger zunächst die zu verwendenden Sequenznummern aus. Nach dem Beenden einer Verbindung werden die Sequenznummern nicht auf Null zurückgesetzt, sondern werden bei der nächsten Verbindung weiter um Eins erhöht, solange, bis sie den Höchstwert von 2³²-1 (≈4 Milliarden) erreicht haben. Danach beginnt der Zähler wieder bei Null. Dieser Mechanismus ist vorgesehen worden, damit auch in einem schnellen Netzwerk keine gleichen Sequenznummern kurz hintereinander auftreten können [WAS94]. Angenommen, die IP-Implementierung gibt die Datagramme in der richtigen Reihenfolge an das TCP weiter, so wird die Sequenznummer stetig um Eins erhöht. Durch die Übertragung auf der IP-Ebene ist jedoch nicht sichergestellt, daß die IP-Datagramme in der Richtung Reihenfolge beim Empfänger eintreffen. Treffen die Datagramme in der falschen Reihenfolge ein, so lassen sich die korrekten Positionen der TCPSequenzen mit Hilfe der Sequenznummern zurückgewinnen. 3.2.1.2 Die Bestätigungsnummer Diese Nummer hat die Funktion, den korrekten Empfang einer Sequenz zu bestätigen. Die Bestätigungsnummer ist nur gültig, falls das ACK-Flag gesetzt ist (vgl. Tabelle 3-4). Ist am ursprünglichen Datensender eine Bestätigung vom Empfänger eingetroffen, so kann der Sender die ursprünglichen Daten verwerfen, die er für eine erneute Sendung zurückgehalten hat. Ist innerhalb einer definierten Zeitspanne keine Bestätigung vom Empfänger gesendet worden, so wiederholt der Sender die Sendung. Diese Zeitgrenze (Timeout) kann auf der Senderseite für jede Verbindung gesetzt werden. Die Bestätigungsnummer, die der Empfänger mitsendet, ist die Sequenznummer des Senders, die im nächsten sinnvollen Datensegments eingetragen wird. 12 Kapitel 3 Die TCP/IP Protokollfamilie 3.2.1.3 Der Daten-Offset Dieser Wert gibt die Länge des TCP-Protokollkopfes in 32-Bit-Wörtern an. Falls Optionen (vgl. Kapitel 3.2.1.8) leer ist, so hat der gesamte Protokollkopf ein Länge von 160 Bit (= 5⋅32 Bit). In das Feld Daten-Offset wird in diesem Fall der Wert 5 eingetragen. 3.2.1.4 Die Flags Die Flags zeigen an, welche der anderen Felder im TCP-Protokoll-Kopf gültige Werte beinhalten (vgl. Tabelle 3-4). Flag URG ACK PSH RST SYN FIN Beschreibung Zeigt die Gültigkeit des Dringlickeitszeigers an. Das Flag wird gesetzt, wenn eine dringende Nachricht über das Netz an eine Anwendung übertragen werden muß. Zeigt die Gültigkeit der Bestätigungsnummer an. Weist die TCP-Implementierung an, dieses Segment sofort weiter zu verarbeiten. Im Regelfall werden eine Anzahl von Segmenten im Empfangspuffer gesammelt, die gemeinsam verarbeitet werden. Zeigt einen schwerwiegenden Fehler an, der eine Verbindungsauflösung erfordert. Es wird nur im äußersten Notfall verwendet. Wird zur Initialisierung einer Verbindung verwendet. In diesem Stadium einigen sich Sender und Empfänger auf die zu verwendenden Bestätigungs- und Sequenznummern. Wird zum Beenden einer Verbindung verwendet. Sobald ein Endknoten alle Daten übertragen hat, sendet er ein Segment, welches das FIN-Flag gesetzt hat. Sobald beide Endknoten eine solches Segment gesendet haben, wird die Verbindung aufgelöst. Tabelle 3-4: Flags des TCP 3.2.1.5 Fenster Dieses Feld gibt die Größe des Puffers an, die der Sender für diese Verbindung reserviert hat. Es dürfen nicht mehr Daten als diese Puffergröße gesendet werden, bevor eine Empfangsbestätigung eingegangen ist. 3.2.1.6 Prüfsumme Die Prüfsumme überprüft den korrekten Empfang des TCP-Protokoll-Kopf und den eigentlichen Daten. Sie berechnet sich aus dem 16 Bit großen Einerkomplement der Summe der Einerkomplemente aller 16 Bit Worte in Protokoll-Kopf und Daten. 13 Kapitel 3 Die TCP/IP Protokollfamilie 3.2.1.7 Dringlichkeitszeiger Dieses Feld beinhaltet einen Wert, der auf das Ende der Daten des Datenfeldes, das als dringlich gilt, zeigt. Dieses Datenfeld soll sofort bearbeitet werden. 3.2.1.8 Optionen Hiermit wird der TCP-Implementierung des Empfängers die Option MSS1 mitgeteilt. Diese Option gibt die maximale Größe der Segmente an, die gesendet werden. 3.2.1.9 Füllzeichen Falls das Feld Optionen gültig ist, werden in Füllzeichen so viele Bits eingefügt, daß der gesamte TCP-Protokoll-Kopf ein Länge hat, die ein Vielfaches von 32 Bit ergibt (vgl. Kapitel 3.2.1.3). 3.2.2 Die Phasen einer TCP-Verbindung An einem Beispiel soll exemplarisch der Ablauf einer kompletten Datenübertragung auf TCP-Ebene gezeigt werden. Dazu wird dieser Ablauf in drei Phasen, die Einrichtungsphase, die Datenaustauschphase und die Abschlußphase eingeteilt. 3.2.2.1 Die Einrichtungsphase Auf dem Sendesystem fordert eine Anwendung der höheren Schichten eine Verbindung zu einem entfernten System an und initiiert damit eine Verbindung auf TCPEbene (vgl. Abbildung 3-4). Die TCP-Implementierung erzeugt ein Segment und gibt es an die IP-Schicht weiter, die daraus ein IP-Datagramm erzeugt. Im TCP-Segment ist das SYN-Flag gesetzt, um dem Empfänger-System zu signalisieren, daß sich die beiden Systeme auf die gültigen Sequenz- und Bestätigungsnummern einigen müssen. Das Sende-System trägt seine aktuelle Sequenznummer in das Segment ein. Die Bestätigungsnummer darf nicht eingetragen werden. Das ACK-Flag wird nicht gesetzt. Das Empfänger-System antwortet mit einem TCP-Segment in dem das SYN- und das ACK-Flag gesetzt sind. Als Sequenznummer wird der eigene aktuelle Wert eingetragen. Die Bestätigungsnummer erhält den um Eins erhöhten Wert der Sequenznummer des gerade empfangenen Segments. Das Sende-System bestätigt dieses Segment, indem das ACK-Flag gesetzt wird. Die Bestätigungsnummer enthält die erhöhte Sequenznummer des Empfänger-Systems. Damit ist die TCP-Verbindung eingerichtet und die Sequenznummern ausgetauscht. Beide Stationen sind jetzt bereit, die eigentlichen Daten auszutauschen. 1 MSS - Maximum Segment Size 14 Kapitel 3 Die TCP/IP Protokollfamilie Netz Empfänger Sender SYN=153 ACK=? SYN 153 kein ACK SYN=321 ACK=154 54 CK 1 A 321 SYN SYN=154 ACK=322 ACK 322 Zeit Abbildung 3-4: Einrichtungsphase 3.2.2.2 Die Datenaustauschphase Um die Zuverlässigkeit einer Datenübertragung zu erhöhen, wird bei einer TCPVerbindung jedes gesendete Segment vom Empfänger bestätigt. Das folgende Beispiel zeigt des einfachste Szenario, daß bei Datenübertragung stattfinden kann (vgl. Abbildung 3-5). Die Daten “xx” werden gesendet S EQ =10 2 AC K=1 19 D ata= xx Empfang wird bestätigt AC =119 SEQ 03 K =1 Abbildung 3-5: Datenaustausch 15 Kapitel 3 Die TCP/IP Protokollfamilie Der Sender sendet seine Daten an den Empfänger und erwartet ein Bestätigungssegment. Dabei wird am Sender ein Timer gestartet. Sollte die vorher festgelegte Zeitgrenze für die Bestätigung überschritten werden, so werden die Daten vom Sender erneut gesendet. Nach dem Empfang des Datensegmentes bestätigt dies der Empfänger mit einem Segment welches ein leeres Datenfeld besitzt. Nachdem der Sender dieses Bestätigungssegment empfangen hat, ist die Datenübertragung abgeschlossen. 3.2.2.3 Die Abschlußphase Möchte eines der beteiligten Systeme die bestehende Verbindung beenden, so initiiert es die Abschlußphase. Dabei sendet dieses System ein TCP-Segment in dem das FINFlag (vgl. Tabelle 3-4) gesetzt ist. Das andere System bestätigt zuerst den Empfang mit einem Segment und antwortet dann mit einem zusätzlichen Segment in dem ebenfalls das FIN-Flag gesetzt ist. Auch dieses Segment muß vom Sender noch einmal bestätigt werden (vgl. Abbildung 3-6). Sender Netz Empfänger SEQ =30 6 AC K=5 17 F IN =307 ACK IN 307 F CK= A 7 =51 SEQ ACK =518 Zeit Abbildung 3-6: Trennen einer Verbindung Die Verbindung wird nicht als geschlossen betrachtet, solange nicht beide Systeme Segmente, in denen das FIN-Flag gesetzt ist, gesendet und den Empfang der FINSegmente bestätigt haben. Falls in dieser Phase Segmente verlorengehen, wird die Verbindung nach Ablauf eines Timeout als getrennt betrachtet. 16 Kapitel 3 Die TCP/IP Protokollfamilie 3.2.3 TCP-Ports Das TCP verwendet Port-Adressen, um Daten an die entsprechenden Dienste der Anwendungsschicht zu senden. Ein Port ist eine Adresse mit der Länge von 16 Bit. Der Bereich von 0 bis 255 ist für bekannte Dienste vordefiniert (vgl. Tabelle 3-5). Dezimal 0 7 17 20 21 23 25 80 110 247-255 Schlüsselwort Reserviert ECHO Quote FTP-Data FTP Telnet SMTP HTTP POP3 Reserviert Beschreibung Echo Losung des Tages Dateiübertragung (Daten) Dateiübertragung (Steuerzeichen) Telnet SMTP-Dienst, E-Mail WWW POP3-Dienst, E-Mail Tabelle 3-5: Einige reservierte TCP-Ports Bei der Entwicklung eines Programms, welches mit dem TCP arbeitet, muß der zu benutzende Port definiert werden. Port-Adressen müssen exklusiv vergeben werden, da nicht zwei unterschiedliche Dienste der Anwendungsschicht auf den selben Port zugreifen dürfen. Deshalb sollte bei der Entwicklung einer Software darauf geachtet werden eine Port-Adresse oberhalb von 255 zu wählen. Anstelle eines festen Ports können Anwendungen auch ein dynamisches Adressierungsverfahren verwenden. Das NFS1 verwendet die Funktion Portmapper, mit der Port-Adressen dynamisch vergeben werden können bzw. mit der der Port, der von einer bestimmten Anwendung benutzt wird, bei Anfrage ermittelt wird. 1 NFS – Network File System 17 Kapitel 4 Das Domain Name System 4 Das Domain Name System Die numerische Adressierungsweise des IP-Protokolls erschwert den Umgang für den Menschen. Für die Arbeit mit großen Systemen ist es deshalb erstrebenswert, ein Namenssystem einzuführen, welches die Adressierung erleichtern soll. In TCP/IPSystemen läßt sich dies in zwei Variationen realisieren. Mit Hilfe einer individuellen Datei, die an jedem Knoten des Netzwerks zur Verfügung steht, oder mit Hilfe eines zentralen Dienstes. In TCP/IP-Systemen werden eine Reihe von Mechanismen verwendet, um Namen in IP-Adressen zu konvertieren. Der grundlegendste ist die Datei hosts, ein anderer das Domain Name System (DNS). 4.1 Die Datei hosts Die auf den Netzwerkknoten laufenden Betriebssysteme verwenden normalerweise die Datei hosts. Über diese Datei ist es den Anwendungsprogrammen möglich, aus einem Namen die dazugehörige IP-Adresse aufzuschlüsseln bzw. umgekehrt aus einer IPAdresse den Namen zu erhalten. Jede IP-Adresse, die in hosts geführt wird besitzt mindestens einen Namenseintrag. Es können jedoch auch mehrere Namen für ein und dieselbe IP-Adresse vergeben werden. Diese zusätzlichen Namen werden als Alias bezeichnet. 4.2 Komplexe Netzwerke Für die Verwendung in komplexen Netzwerken erweist sich die Datei hosts als unpraktikabel, da der Verwaltungsaufwand proportional zur Anzahl der Knoten steigt. Mit einem Domainnamen kann ein Knoten, der im Internet registriert ist, eindeutig identifiziert werden. Eine weitere Hauptfunktion des DNS besteht in der Übersetzung dieser Namen in die zugehörigen eindeutigen IP-Adressen, da alle TCP/IP-Kommunikation auf Grundlage dieser IP-Adressen stattfindet. Die umgekehrte Übersetzung ist ebenfalls möglich. Das DNS stellt zusätzlich zu diesen Hauptfunktionen noch andere Funktionen zur Verfügung. Die Definitionen sehen vor, daß auch die Anwendungstypen, die auf den Knoten verfügbar sind, über das DNS bestimmt werden können. Um mit Namen zu arbeiten, muß eine allgemeine Struktur definiert werden. Das DNS ist hierarchisch und verwendet einzelne Komponenten in einem vollständigen Namen, um die unterschiedlichen Verwaltungsebenen zu bezeichnen. Dies kann als umgekehrter Baum illustriert werden (vgl. Abbildung 4-1): 18 Kapitel 4 Das Domain Name System de ruhr-uni-bochum etdv et thrall theme thunder uni-essen pc1 pc2 thread Host-Domain-Namen: 1. thrall.etdv.ruhr-uni-bochum.de 2. theme.etdv.ruhr-uni-bochum.de 3. thunder.etdv.ruhr-uni-bochum.de 4. pc1.uni-essen.de 5. pc2.uni-essen.de Abbildung 4-1: Beispiel DNS-Struktur Die oberste Verwaltungsebene läßt sich als Wurzel bezeichnen. Sie kann in Äste (SubDomain) und Blätter (Host) aufgeteilt werden. Der Zusammenschluß gibt die weltweit eindeutigen Rechnernamen wieder. 4.3 Server-Funktionalität Für ein funktionierendes DNS-System bedarf es zwei Komponenten, den DNS-Client und den DNS-Server. Der DNS-Client ist Bestandteil der Netzwerk-Implementierung, die auf einem Host installiert ist. Er stellt Namensauflösungs-Anfragen an den DNSServer, um die zu einem Namen zugehörige IP-Adresse zu erlangen. Der DNS-Server ist ein Dienst, welcher eine Datenbank führt, die eine ähnliche Struktur besitzt wie eine hosts-Datei (vgl. Kapitel 4.1). Mit Hilfe dieser Datenbank lassen sich die Anfragen der DNS-Clients beantworten. Dem DNS-Server müssen mindestens alle Hosts bekannt sein, die sich innerhalb der Domäne befinden, welche er kontrolliert. Wird von einem Client eine Namensauflösung einer anderen Domäne angefordert, so gibt der DNS-Server diese Anfrage an den zuständigen übergeordneten DNS-Server weiter. 19 Kapitel 5 Pflichtenheft 5 Pflichtenheft 5.1 Zielbestimmung Die zu implementierende Software soll es einen Rechnersystem, auf dem die Software installiert wird ermöglichen, sich in einen Rechnerverbund zu integrieren. Die Teilnehmer dieses Verbundes tauschen Systemdaten aus, die an jedem Rechner abrufbar sind. 5.1.1 Mußkriterien • • • • • • • Die Suche nach einem bereits bestehenden Verbund im Netzwerk Initialisierung eines neuen Verbundes Senden der eigenen Systemdaten Empfangen anderer Systemdaten Speichern einer Rechnerliste auf einem lokalen Datenträger im CSV-Format Löschen eines nicht mehr verfügbaren Rechners aus dem Rechnerverbund Lauffähig unter MS Windows NT ohne Administrator-Rechte 5.1.2 Wunschkriterien • Möglichst kurze Aktualisierungs-Intervalle, ohne das Netzwerk zu stark zu belasten • Minimale Prozessor-Belastung • Hohe Stabilität bei langer Laufzeit 5.1.3 Abgrenzungskriterien Die Software setzt ausschließlich auf das TCP/IP-Protokoll auf und ist mit anderen Netzwerkprotokollen nicht lauffähig. Der Betrieb beschränkt sich auf das Betriebssystem MS Windows NT 4.0. 5.2 Produkteinsatz Das Produkt dient zur Erkennung von Systemresourcen in einem Rechnerverbund. Dabei sind aktuell verfügbare Ressourcen an jedem Rechner in einer Liste zu führen. 5.2.1 Anwendungsbereiche • Systemmanagement 20 Kapitel 5 Pflichtenheft 5.2.2 Zielgruppen • Keine besondere Spezifikation einer Zielgruppe 5.2.3 Betriebsbedingungen • LAN1-Umgebung • WAN2-Umgebung 5.3 Produktumgebung 5.3.1 Software • Betriebssystem MS Windows NT 5.3.2 Hardware • Die Hardwareanforderungen entsprechen dem des Betriebssystems 5.3.3 Orgware • Applikation für jeden Kommunikationsteilnehmer erforderlich • Netzwerkanbindung 5.3.4 Produktschnittstellen Die aktuelle Rechnerliste wird in einer Datei auf einem lokalen Datenträger (primär Festplatte) gespeichert. Eine Auswertung durch das Programm MS Excel soll möglich sein. 5.4 Produktfunktionen 5.4.1 Zusammenstellen der eigenen Systemdaten • • • • • • • /F10/ /F20/ /F30/ /F40/ /F50/ /F60/ /F70/ Abfrage des Rechnernamens Abfrage des Benutzernamens Abfrage der IP-Adresse Abfrage der MAC-Adresse Abfrage der Subnetzmaske Errechnen der Netzadresse Ermittlung der Domäne aus dem kompletten DNS-Rechnernamen 1 LAN – Local Area Network 2 WAN – Wide Area Network 21 Kapitel 5 • • • • • • • • • • • • • /F80/ /F90/ /F100/ /F110/ /F120/ /F130/ /F140/ /F150/ /F160/ /F170/ /F180/ /F190/ /F200/ Pflichtenheft Abfrage des Betriebssystems und der Versionsnummer Abfrage des Prozessorherstellers Abfrage des Prozessortyps Abfrage der Taktfrequenz des Prozessors Abfrage der Anzahl der Prozessoren Abfrage der momentanen Prozessorauslastung Abfrage des Festplattenplatzes Abfrage des frei verfügbaren Festplattenplatzes Abfrage des physikalischen Speichers Abfrage des frei verfügbaren physikalischen Speichers Abfrage des virtuellen Speichers Abfrage des frei verfügbaren virtuellen Speichers Abfrage des Status des Bildschirmschoners 5.4.2 Systemdatenaustausch • • • • • • /F210/ /F220/ /F230/ /F240/ /F250/ /F260/ Erkennung eines existierenden Rechners im gleichen Netzwerk Erkennung einer existierenden Applikation im gleichen Netzwerk Systemdaten von anderen Rechner anfragen und empfangen Systemdatenanfragen von anderen Rechnern beantworten Sortieren und Darstellen der Rechner-Liste auf dem Bildschirm Periodische Aktualisierung der Rechner-Liste 5.4.3 Datenarchivierung • • • • • /F270/ /F280/ /F290/ /F300/ /F310/ Neuerstellung einer Archivdatei Datenübernahme aus einer bestehenden Archivdatei Aktualisierung einer bestehenden Archivdatei Speichern der Rechnerliste und aller Systemdaten in der Archivdatei Die Datei hat das CSV-Datenformat 5.5 Produktdaten 5.5.1 Systemdaten • /D10/ Für jeden Rechner sind folgende Daten zu speichern: Rechnername, Benutzername, Name der Domäne, IP-Adresse, Netzwerkadresse, Subnetzmaske, CPU-Typ, CPU-Geschwindigkeit, Festplattenplatz, freier Festplattenplatz, Hauptspeicher, freier Hauptspeicher, virtueller Speicher, Status des Bildschirmschoners, Verbindungsbandbreite, Zeitpunkt des letzten Lebenszeichens 22 Kapitel 5 Pflichtenheft 5.6 Produkt-Leistungen • /L10/ Die Aktualisierung (/F260/ und /F290/) sollte in Intervallen von variabler Länge erfolgen. Anzustreben sind periodische Aktualisierungen im Bereich von wenigen Sekunden. • /L20/ Die Rechnerliste besitzt keine Obergrenze für die Anzahl der beinhalteten Rechner. 5.7 Benutzungsschnittstelle • /B10/ Die Rechnerliste ist über ein Listenfeld in einem Dialogfeld einsichtbar. • /B20/ Es können Parameter zu Programmeinstellungen gesetzt werden 5.8 Qualitäts-Bestimmung Produktqualität Funktionalität Zuverlässigkeit Benutzbarkeit Geschwindigkeit Änderbarkeit Stabilität Verträglichkeit Übertragbarkeit sehr gut gut normal nicht relevant X X X X X X X X Tabelle 5-1: Qualitätsbestimmung 5.9 Globale Testfälle • • • • • • • /T10/ /T20/ /T30/ /T40/ /T50/ /T60/ /T70/ Initialisierung eines Rechnerverbundes Zusammenschluß mehrerer Rechner im gleichen Netzwerksegment Auswertung der Archivdatei mittels MS Excel Ordentliches Beenden des Programmes Programmabsturz simulieren Netzwerkstörung simulieren Applikationsstabilität prüfen 23 Kapitel 5 Pflichtenheft 5.10 Entwicklungsumgebung • MS Visual Studio C++ • MS Windows NT Workstation 24 Kapitel 6 Der Scanner 6 Der Scanner Um den Austausch von Systemdaten zwischen Systemen zu ermöglichen, ist es notwendig, daß die entfernten Systeme die Existenz anderer Systeme erkennen. Weiterhin muß erkannt werden, ob die Applikation, die den Datenaustausch ermöglicht, auf einem existierenden System vorhanden ist. Dazu ist es notwendig, daß Netzwerk systematisch zu durchsuchen (Scannen). Der in die Applikation implementierte Scanner geht dabei in zwei Schritten vor. Im ersten Schritt wird versucht einen Host zu erreichen. Im zweiten Schritt wird versucht die Applikation zu erkennen. 6.1 Die Host-Erkennung IP-Implementationen unterstützen im allgemeinen das Internet Control Message Protocol (ICMP). Das ICMP ermöglicht den Versand von Nachrichten in einem IPNetzwerk zu Diagnose- bzw. Informations-Zwecken. Dazu transportiert das ICMP seine Meldungen in IP-Datagrammen. Ein Teil des ICMP sind die Echo-Nachrichten. Die Echo-Nachrichten werden am häufigsten zur Diagnose eines Netzwerkes herangezogen. Sendet der Absender ein Paket vom Typ Echo-Request an einen Empfänger, so antwortet dieser mit einem Paket vom Typ Echo-Reply (vgl. Abbildung 6-1). Echo request Empfänger Sender Echo reply Abbildung 6-1: Erkennen eines Hosts Der Absender kann dabei eine Zeitschranke (Timeout) festlegen, in der eine Antwort des anderen Systems erfolgen muß. Trifft keine Antwort innerhalb dieses Zeitraums ein, so gilt das andere System als nicht erreichbar. Der Absender kann damit entscheiden, ob ein Hosts konnektierbar ist, oder nicht (vgl. Abbildung 6-2). 25 Kapitel 6 Der Scanner Echo-Request senden Antwort innerhalb Zeitschranke ? Nein Host existiert nicht Ja Host existiert Abbildung 6-2: Host-Erkennung Dies ist die gleiche Vorgehensweise, die das Programm Ping verwendet. 6.2 Die Applikations-Erkennung Damit eine Kommunikation zwischen den Applikationen stattfinden kann, verwendet die Applikation auf jedem System einen fest eingestellten TCP-Port (vgl. Kapitel 3.2.3). Dieser Port wird exklusiv von der Applikation benutzt. Beim Scan wird versucht auf diesem Port eine Verbindung einzurichten. Falls eine Verbindung erfolgreich zustande kommt, so wird damit angezeigt, daß die Applikation auf einem entfernten System vorhanden ist (vgl. Abbildung 6-3). Verbindung initieren Kommt Verbindung zustande ? Nein Applikation läuft nicht Ja Applikation läuft Abbildung 6-3: Applikations-Erkennung 26 Kapitel 6 Der Scanner Wie bei der Host-Erkennung (vgl. Kapitel 6.1) verwendet auch die TCP-Implementation eine Zeitschranke für den Verbindungsaufbau. Kommt in dieser Zeit keine Verbindung zustande, so wird der Versuch nach Ablauf der Zeit abgebrochen. 6.3 Zweistufiges Verfahren Aus Performance-Gründen wird bei dem Erkennen der Applikation ein zweistufiges Verfahren verwendet. Falls die Applikation auf einem entfernten Host vorhanden ist, muß dieser Host natürlich konnektierbar sein. Deshalb lassen sich die Verfahren aus Kapitel 6.1 und Kapitel 6.2 nacheinander ausführen (vgl. Abbildung 6-4). Echo-Request senden Antwort innerhalb Zeitschranke ? Nein Host existiert nicht Nein Applikation läuft nicht Ja Host existiert Verbindung initieren Kommt Verbindung zustande ? Ja Applikation läuft Abbildung 6-4: Zweistufiges Verfahren Diese Vorgehensweise ist für eine Zeitoptimierung notwendig. Tritt der Fall ein, daß eine TCP-Verbindung zu einem Host initiiert wird, der nicht existiert, so dauert es ca. 60 Sekunden, bis das Timeout greift. Für den Fall, daß der Host erreichbar ist, die Applikation jedoch nicht läuft, so wird der TCP-Verbindungsversuch sofort abge27 Kapitel 6 Der Scanner brochen, weil der entfernte Host die TCP-Verbindung direkt abweisen kann. Es muß in diesem Fall nicht auf das Timeout gewartet werden. Es ist somit ratsam zuerst die Erreichbarkeit des jeweiligen Hosts sicherzustellen, da der Timeout-Wert für das ICMP sehr klein ist und daher eine untergeordnete Rolle spielt. 6.4 Parallele Verarbeitung Da der Scanner die meiste Zeit damit beschäftigt ist, auf einen Timeout zu warten, wird die CPU des Systems dadurch kaum belastet. Diese Wartezeiten lassen sich sinnvoll nutzen, indem mehrere Hosts gleichzeitig überprüft werden (vgl. Abbildung 6-5). Da die meisten Subnetze höchstens einige hundert Hosts beinhalten, lassen sich in der Praxis sogar alle Hosts gleichzeitig überprüfen, ohne die CPU großartig zu belasten. Zweistufiges Verfahren Host 1 Zweistufiges Verfahren Host 2 … Zweistufiges Verfahren Host n Ergebnis Ergebnis … Ergebnis Abbildung 6-5: Scanner Ein zusätzlicher Vorteil besteht darin, daß die einzelnen Ergebnisse schneller vorliegen. Der gesamte Scan hat folglich ungefähr die Dauer eines einzigen zweistufigen Verfahrens. Ohne parallele Ausführungspfade liegt die Zeit bei n Einzeldurchläufen bei der n-fachen Zeit. 28 Kapitel 7 Die Kommunikation mit anderen Rechnern 7 Die Kommunikation mit anderen Rechnern Die implementierte Applikation muß mit anderen gleichen Applikationen auf entfernten Systemen kommunizieren können. Die Kommunikation zwischen den Rechnern gehorcht dabei einem bestimmten Ablauf. Ferner sind Regeln festgelegt worden, in welcher Art und Weise die eigentlichen Informationen übermittelt werden. 7.1 Das Übertragungsprotokoll Die Applikation verwendet ein eigenes Protokoll, welches zum Senden bzw. Empfangen von Nachrichten benutzt wird. Dieses Protokoll verwendet die Netzwerkprotokolle TCP/IP, um die Nachrichten über das Netzwerk zu transportieren (vgl. Abbildung 7-1) Applikation Applikation Nachrichten Nachrichten Applikationsprotokoll Applikationsprotokoll TCP/IPSocket TCP/IPSocket Netzwerk Abbildung 7-1: Kommunikationsweg Eine Nachricht besteht aus zwei logischen Teilen, dem Protokollkopf und den Nutzdaten. Der Protokollkopf hat eine feste Länge von 24 Byte, die Länge des Nutzdatenfeldes ist variable (vgl. Abbildung 7-2). Protokollkopf 0 Nutzdaten 24 Bytes variable Abbildung 7-2: Protokollkopf und Nutzdaten Der Protokollkopf hat die Funktion, die Applikation (Applikationsname), die diese Nachricht gesendet hat, eindeutig zu kennzeichnen. Dabei wird auch die Versionsnummer der Applikation und der Typ mitgesendet (vgl. Abbildung 7-3). 29 Kapitel 7 Die Kommunikation mit anderen Rechnern Applikationsname 0 Typ Versionsnummer 15 19 24 Bytes Abbildung 7-3: Protokollkopf Es sind zwei verschiedene Nachrichtentypen definiert. Der erste Typ hat die Aufgabe die eigenen Systemdaten zu versenden. Die Systemdaten werden dazu in das Nutzdatenfeld eingetragen (vgl. Abbildung 7-4). Protokollkopf 0 Systemdaten 24 Bytes Variable Abbildung 7-4: Paket-Typ 1 Die Systemdaten, die allesamt in Strings gespeichert sind, werden im Klartext nacheinander in das Nutzdatenfeld geschrieben. Vor jedem String wird die Länge des nachfolgenden Strings eingetragen (vgl. Abbildung 7-5). Länge String 1 String 1 Länge String 2 String 2 … Abbildung 7-5: Aufbau der Nutzdaten Die Daten werden in der Reihenfolge Rechnername, IP-Adresse, Subnetzmaske, Netzwerknummer, Domain Name, MAC-Adresse, Betriebssystem, Prozessor-Hersteller, Prozessor-Typ, Prozessor-Last, Prozessor-Geschwindigkeit, Anzahl Prozessoren, Festplattenplatz, freier Festplattenplatz, physikalischer Speicher, freier physikalischer Speicher, virtueller Speicher, freier virtueller Speicher und Bildschirmschoner im Feld Systemdaten gespeichert. Der zweite Typ wird bei der Performance-Messung eingesetzt. Dazu wird in das Nutzdatenfeld eine zufällige Zeichenfolge eingetragen. Der Inhalt des Datenfeldes wird beim Empfänger verworfen, wichtig ist die fest eingestellte Länge von 100 KByte für das Nutzdatenfeld (vgl. Abbildung 7-6). Protokollkopf 0 zufällige Zeichenfolge 24 Bytes 100 KByte Abbildung 7-6: Paket-Typ 2 30 Kapitel 7 Die Kommunikation mit anderen Rechnern 7.2 Der Kommunikationsablauf Der erste Schritt zu einem Kommunikationaufbau ist die Bestimmung des Kommunikationspartners. Die Applikation muß als erstes in Erfahrung bringen, mit welchen anderen Rechnern ein Nachrichtenaustausch möglich ist, bzw. auf welchen Rechnern die Applikation läuft. Dazu wird das Netzwerk nach solchen Systemen gescannt (vgl. Kapitel 6). Als nächstes werden die Übertragungs-Bandbreiten zu den anderen Systemen gemessen. Dazu wird an jeden erkannten Rechner mit laufender Applikation eine Nachricht vom Typ 2 gesendet. Danach können die Systemdaten ausgetauscht werden. Dazu wird periodisch an jedes System des Rechnerverbundes eine Nachricht vom Typ 1 gesendet, worin die eigenen Systemdaten enthalten sind. Netz System B System A Scanner System B erkannt twort Scanneran Typ 2 Typ 1 System A erkannt Typ 2 Typ 1 Typ 1 Zeit Abbildung 7-7: Kommunikationsablauf In dem Beispiel nach Abbildung 7-7 existieren die Systeme A und B, auf denen die Applikation läuft. Sobald das System B die erste Nachricht von System A empfangen hat, kann Rechner B daraus schließen, daß auf Rechner A ebenfalls die Applikation vorhanden ist. Der Scanner wird dabei nicht als Applikations-Nachricht betrachtet, da er auf TCP-Ebene beantwortet wird (Scannerantwort). Die Applikation erhält keine Meldung, wenn sie von einem fremden Scanner erfaßt wird. Der Host B kann die Existenz von Host A erst erkennen, wenn das Paket vom Typ 2 eintrifft. Das System B kann System A direkt in seine Rechnerliste aufnehmen, ohne System A vorher mit 31 Kapitel 7 Die Kommunikation mit anderen Rechnern dem Scanner erfaßt zu haben. Der Rechner A sendet ab jetzt periodisch Pakete vom Typ 1, um seine Systemdaten mitzuteilen. Rechner B sendet zunächst ein Paket vom Typ 2 zur Performance-Messung, danach ebenfalls periodisch Pakete vom Typ 1 mit den eigenen Systemdaten. 32 Kapitel 8 Das Programm Systemdetector 8 Das Programm Systemdetector Das Programm Systemdetector realisiert die gewünschten Funktionen aus Kapitel 5. Sinn und Zweck des Programmes ist es, zunächst die eigenen Systemdaten festzustellen. Danach versucht das Programm gleiche Applikationen im Netzwerk zu finden (vgl. Kapitel 6), um dann die Systemdaten mit ihnen auszutauschen. Da spezielle Funktionen des MS Windows NT 4.0 Betriebssystems verwendet werden, ist das Programm lediglich auf dieser Plattform einsetzbar. 8.1 Der Programmablauf Der Programmablauf kann in zwei Abschnitte unterteilt werden. In der ersten Phase stellt die Applikation die eigenen Systemdaten zusammen, in der zweiten Phase werden diese Daten mit anderen Systemen ausgetauscht. 8.1.1 Der Programmstart Bevor der normale Programmablauf gestartet werden kann, müssen diverse Vorarbeiten beim Programmstart geleistet werden. Dazu gehört im wesentlichen das Initialisieren von verschiedenen Programmfunktionen, um einen sicheren Betrieb im Netzwerk vorauszusetzen. 8.1.1.1 Überprüfungen Aufgrund der Datenkonsistenz ist es zwingend notwendig, daß das Programm Systemdetector auf jedem System nicht mehrmals gleichzeitig ausgeführt werden darf. Start Läuft Applikation schon auf diesem Ja System ? Programmende Nein Existiert ein Netzwerk? Nein Scanner deaktivieren Ja Abbildung 8-1: Überprüfungen 33 Kapitel 8 Das Programm Systemdetector Deshalb wird zunächst überprüft, ob eine gleiche Applikation bereits gestartet ist. Ist dies der Fall, so wird das Programm sofort mit einer entsprechenden Meldung beendet. Die zweite Überprüfung, die beim Programmstart stattfindet, ist die Bestimmung eines Netzwerks. Ist kein Netzwerk vorhanden, weil es in dem System beispielsweise kein Netzwerkinterface existiert, so läuft das Programm zwar weiter, der Betrieb ist aber nur eingeschränkt möglich, da alle Funktionen zum Datenaustausch mit anderen Systemen deaktiviert sind. Falls ein Netzwerk existiert, so erfolgt ein regulärer Programmstart (vgl. Abbildung 8-1). 8.1.1.2 Programmeinstellungen laden und Timer starten Der Benutzer verfügt über die Möglichkeit diverse Einstellung des Programms manuell vorzunehmen. Dadurch kann die Ausführung der Applikation an das System und die Netzwerkumgebung angepaßt werden. Diese Einstellungen werden in der Konfigurationsdatei sd.ini gespeichert, die sich im MS Windows-NT-Verzeichnis befindet. Fehlt diese Datei, oder Werte in dieser, werden Standardwerte für die jeweiligen Optionen angenommen. Mit Hilfe dieser Einstellungen werden diverse Timer, die das Programm benötigt, initialisiert und gestartet (vgl. Abbildung 8-2). Existiert die Datei sd.ini ? Ja sd.ini laden Ja Standardwerte an den Fehlstellen eintragen Nein Gibt es Fehlstellen ? Nein Timer starten Abbildung 8-2: Konfiguration laden 34 Kapitel 8 Das Programm Systemdetector 8.1.1.3 Bestimmung der eigenen Systemdaten Nachdem die Konfiguration geladen worden ist, werden jetzt Informationen über das eigene System eingeholt. Die Systemdaten lassen sich dabei in zwei Arten unterteilen, statische und dynamische Daten. Bei den statischen Systemdaten wird angenommen, daß sie sich während der Laufzeit des Programmes nicht verändern. Sie werden einmal bestimmt und müssen danach nicht mehr aktualisiert werden. Zu diesen Datentypen gehört z.B. der Prozessortyp. Die dynamischen Systemdaten können sich während der Laufzeit des Programms ändern. Sie werden sofort bestimmt (vgl. Abbildung 8-3) und im späteren Programmablauf periodisch aktualisiert. Statische Daten bestimmen Dynamische Daten bestimmen Abbildung 8-3: Statische und dynamische Daten Eine Aufstellung aller Systemdaten, die vom Programm Systemdetector erfaßt werden, ist in Anhang A zu finden. 8.1.1.4 Ausgabedatei einlesen Die vorhandenen Systeme im Netzwerk werden in einer Ausgabedatei gespeichert. Beim Programmstart wird diese Datei automatisch geladen, falls sie noch von einem früheren Programmablauf existiert. Unter der Voraussetzung, daß die Datei nicht gelöscht wird, bleibt ein einmal erkanntes System auch nach unendlich vielen Neustarts der Applikation in der Ausgabedatei erhalten (vgl. Abbildung 8-4). Existiert eine Ausgabedatei? Ja Ausgabedatei laden Nein Abbildung 8-4: Ausgabedatei laden 35 Kapitel 8 Das Programm Systemdetector 8.1.1.5 Nebenläufige Threads starten Neben dem Hauptprogramm werden drei zusätzliche Ausführungspfade (Threads) gestartet (vgl. Kapitel Anhang B). Dadurch entsteht eine Multitasking-Applikation, bei der insgesamt vier Threads gleichzeitig ausgeführt werden (vgl. Abbildung 8-5). Zwei der Threads haben die Aufgabe die momentane CPU-Auslastung abzufragen und die dynamischen Systemdaten periodisch zu aktualisieren. Der dritte Thread startet einen Server, der für den Empfang eingehender Datenpakete durch das Netzwerk zuständig ist (vgl. Kapitel 2). CPU-Thread starten Thread für dynamische Daten starten Server-Thread starten Haupt-Thread Daten-Thread Server-Thread CPU-Thread Abbildung 8-5: Threads starten 8.1.1.6 Scanner und Hauptdialog starten Um gleiche Anwendungen auf anderen Systemen zu erkennen, wird der Scanner benutzt (vgl. Kapitel 6). Da der Scanner intern mit paralleler Verarbeitung arbeitet, bietet sich auch hier die Verwendung von mehreren Threads an (vgl. Abbildung 8-6). Haupt-Thread Scanner starten Hauptdialog starten … Thread Host 1 Thread Host n Haupt-Thread Abbildung 8-6: Scanner und Hauptdialog starten 36 Kapitel 8 Das Programm Systemdetector Um die Suchzeiten zu minimieren wird deshalb für jeden existierenden Host im Netzwerk ein eigener Thread gestartet. Die Anzahl der parallelen Ausführungspfade sind also abhängig von der Anzahl der möglichen Hosts im Netzwerk. Als letzter Schritt während des Programmstarts wird der Hauptdialog, die visuelle Benutzerschnittstelle gestartet. 8.1.2 Der Ablauf der Ausführungspfade In diesem Unterkapitel sind die vier Ausführungspfade beschrieben, die beim Programmstart erzeugt werden. 8.1.2.1 Der Haupt-Thread Die Hauptaufgabe dieses Ausführungspfades ist die Darstellung der Dialogfelder, welche die Benutzungsschnittstelle darstellen. Zusätzlich wird der gesamte Versand von System-Daten-Paketen hier abgewickelt. Funktionen, wie die Organisation der Rechnerdaten, werden mit Hilfe von Timern (vgl. Kapitel 8.1.1.2) zeitgesteuert abgewickelt (vgl. Abbildung 8-7). Dialogfelder aktualisieren Gibt es ein Timer-Ereignis ? Ja Ereignis auswerten Nein Abbildung 8-7: Haupt-Thread Hat ein Timer-Ereignis stattgefunden, so muß ausgewertet werden, welcher Timer dieses Ereignis ausgelöst hat. Abhängig von der ID1 des auslösenden Timers werden Anweisungen abgearbeitet. Das Programm verwendet drei verschiedene Timer, die in unterschiedlichen Abständen ausgelöst werden (vgl. Abbildung 8-8). 1 ID – Identifier, gibt die Nummer des auslösenden Timers an 37 Kapitel 8 Das Programm Systemdetector Gibt es ein Timer-Ereignis ? Ja 1 Ereignis ID 2 3 Nein Systemdaten senden Scanner starten Dialogfelddaten aktualisieren Darstellung des eigenen Systems überprüfen Rechnerfeld überprüfen Abbildung 8-8: Timer 8.1.2.2 Der CPU-Thread Die CPU-Auslastung gehört zu den dynamischen Systemdaten. Die CPU wird gesondert betrachtet, da die Prossorauslastung sich sprungartig in einem System von einem Moment auf den anderen ändern kann. Das Abfrage-Intervall muß deshalb sehr kurz sein, um eine sinnvolle Aussage über die momentane Auslastung zu machen. Aus diesem Grund beträgt der Standard-Wert für dieses Intervall 1 Sekunde. Damit die Intervall-Länge unabhängig variiert werden kann, wird ein eigener Thread gestartet, in dem die CPU-Auslastung periodisch abgefragt wird (vgl. Abbildung 8-9). CPU-Thread Zähler initialisieren Zähler abfragen Warten (Intervall-Länge) Abbildung 8-9: CPU-Thread 38 Kapitel 8 Das Programm Systemdetector Zur Abfrage der CPU-Auslastung wird auf eine spezielle Schnittstelle von MS Windows NT zurückgegriffen, indem auf Funktionen des internen Systemmonitors des Betriebssystems zugegriffen wird. Diese Funktionen werden von der Programmbibliothek pdh.dll bereitgestellt. Für eine Systemdatenquelle, die auf diese Weise erfaßt werden soll, muß ein Zähler bereitgestellt werden. Nach der Initialisierung des Zählers kann er dann periodisch abgefragt werden. Der Zähler liefert bei jeder Abfrage einen Mittelwert zurück, der aus den Werten zwischen den letzten beiden Abfragepunkten berechnet worden ist. 8.1.2.3 Der System-Daten-Thread Die anderen dynamischen Systemdaten besitzen gegenüber der CPU-Auslastung einen Unterschied. Sie ändern sich nicht so sprunghaft und sind deshalb annähernd als stetig zu betrachten. Der prinzipielle Ablauf dieses Threads ist der gleiche wie der des CPUThreads (vgl. Abbildung 8-10). Die Intervall-Länge ist im allgemeinen jedoch größer und beträgt standardmäßig 10 Sekunden. Daten-Thread Dynamische Systemdaten abfragen Warten (Intervall-Länge) Abbildung 8-10: Daten-Thread Die dynamischen Systemdaten werden teilweise auch über die Programmbibliothek pdh.dll abgefragt. Für diese Daten müssen ebenfalls Zähler zur Verfügung gestellt werden (vgl. Kapitel 8.1.1.2). Es gibt jedoch auch Systeminformationen, die über eine einfache Anweisung ermittelt werden können. Die lokale Rechnername kann z.B. mit der Funktion gethostname() abgefragt werden. 8.1.2.4 Der Server-Thread Der Server-Thread hat die Aufgabe die Systemdaten der anderen Systeme zu empfangen. Dazu überwacht er den voreingestellten TCP-Port 9001. Zur Kommunikation wird ein Socket verwendet. Unter einem Socket wird ein Kommunikationsendpunkt verstanden, durch den eine MS Windows-Socket-Anwendung Datenpakete über das Netzwerk sendet oder empfängt. Sockets können gleichzeitig in beide Richtungen übertragen (Vollduplex). Ein Socket hat einen bestimmten Typ und kann außerdem 39 Kapitel 8 Das Programm Systemdetector einen Namen besitzen. Es sind im wesentlichen zwei Socket-Typen definiert, Streamund Datagramm-Sockets. Stream-Sockets stellen einen Datenfluß ohne Satzgrenzen her. Die Streams werden am Empfänger garantiert in der richtigen Reihenfolge abgeliefert, daß bedeutet in der Reihenfolge, in der sie vom Sender gesendet worden sind. Datagramm-Sockets unterstützen einen satzorientierten Datenfluß, der nicht garantiert abgeliefert wird. Deshalb ist es nicht sichergestellt, daß die Sendungen in der richtigen Reihenfolge am Empfänger eintreffen. Der Empfang von Duplikaten (gleiche Datenpakete) ist ebenfalls nicht ausgeschlossen. Der Server-Thread benutzt einen Stream-Socket, um eine sichere Übertragung zu garantieren. Die Übertragung zu einem entfernten System läuft verbindungsorientiert ab. Es liegt deshalb nahe, daß für diese Verbindung das TCP verwendet wird (vgl. Kapitel 3.2). Bei der Anwendung von Sockets ist es jedoch nicht notwendig sich um die unteren Netzwerkschicht zu kümmern, auf die der Socket aufsetzt. Durch die Verwendung eines Sockets entsteht eine neue abstrakte universelle Programmierschnittstelle (vgl. Abbildung 8-11). Anwendung Funktionen Socket TCP IP Abbildung 8-11: Socket als neue Schnittstelle Die Funktionen innerhalb einer Anwendung greifen über den Socket auf die unteren Schichten des Netzwerkmodells zu. Das TCP und das IP erscheinen für die Anwendung transparent, wodurch eine einfachere und abstraktere Programmierung möglich ist. Sockets besitzen drei unterschiedliche Funktionsarten, den blockierenden, nicht blockierenden und asynchronen Modus. Versucht ein blockierender Socket Daten über das Netzwerk zu senden oder zu empfangen, so wird der Ausführungspfad solange angehalten, bis diese Anweisung ein Ergebnis zurückliefert. Der Thread ist also für diese Zeit blockiert. Ein nicht blockierender Socket fragt beim Senden bzw. beim Empfangen periodisch den Sende- bzw. den Empfangs-Puffer ab, was auch als Polling 40 Kapitel 8 Das Programm Systemdetector bezeichnet wird. Der Ausführungspfad ist zwar für diese Funktionsart nicht blockiert, es muß aber ein großer programmiertechnischer Aufwand betrieben werden, um einen solchen Socket zu realisieren. Ein asynchroner Socket arbeitet nach dem NachrichtenPrinzip. Er überprüft ständig den Sende- und Empfangs-Puffer, wie der blockierende Socket. Falls ein Ereignis stattfinden, so sendet er eine Nachricht an die Anwendung (vgl. Abbildung 8-12). Winsock Funktionsaufruf Blockierender Modus Nicht blockierender Modus Asynchroner Modus Warten Polling Ausführung von anderen Funktionen Initialisieren...verarbeiten...abgeschlossen Initialisieren...verarbeiten...abgeschlossen Anwendung Funktionsergebnis Initialisieren...verarbeiten...abgeschlossen Winsock DLL Abbildung 8-12: Socket-Modi Ein asynchroner Socket kann für eine Anwendung Vorteile haben, denn die Applikation wird durch den Netzwerkverkehr im Gegensatz zu den anderen Modi kaum belastet. Ein asynchroner Socket läßt sich jedoch nur realisieren, wenn für den Socket ein zusätzlicher Thread gestartet wird. Dieser Ausführungspfad wird im Programm Systemdetector als Server-Thread bezeichnet. Der Thread muß programmiertechnisch nicht explizit gestartet werden. Durch die Konstruktion eines asynchronen Sockets wird der Pfad automatisch gestartet und der Netzwerkverkehr überprüft (vgl. Abbildung 8-13). Haupt-Thread Asynchronen Socket erstellen Server-Thread Netzwerkverkehr überprüfen Haupt-Thread Nachricht Nachricht Nachricht Abbildung 8-13: Server-Thread 41 Kapitel 8 Das Programm Systemdetector Nach dem Start des Server-Threads kommuniziert er mit dem Haupt-Thread über Nachrichten. Da diese Kommunikation nur im Bedarfsfall stattfindet sind die Warteund Ausführungszeiten für die Applikation minimal. Die Nachrichten, die der HauptThread an den Server-Thread sendet sind Funktionsaufrufe oder Befehle, die auf einen Socket angewandt werden können. Dadurch wird die Kommunikation mit anderen Systemen gesteuert. Die wichtigsten Socket-Befehle sind in Tabelle 8-1 dargestellt. Befehl Accept Close Connect Beschreibung Akzeptiert eine Verbindungs-Anfrage von einem anderen System Schließt eine bestehende Verbindung Stellt eine Verbindungs-Anfrage zu einem anderen System. Der Socket verhält sich wie ein Client GetPeerName Gibt den Namen des Verbindungspartners und den Port der bestehenden Verbindung an Schaltet den Socket in den Hören-Modus. Der Socket arbeitet Listen daraufhin als Server Receive Empfängt Daten auf einem Socket Send Sendet Daten über einen Socket Tabelle 8-1: Socket-Befehle Falls ein Ereignis auf einem Socket stattfindet, so wird diese mit einer Nachricht an den Haupt-Thread gemeldet. Die wichtigsten Socket-Ereignisse sind in Tabelle 8-2 dargestellt. Ereignis OnAccept Beschreibung Es wird signalisiert, daß auf einem Socket, der als Server arbeitet, eine Verbindungsanforderung eingegangen ist OnClose Diese Nachricht signalisiert, daß der andere Verbindungspartner die Verbindung geschlossen hat OnConnect Es wird signalisiert, daß eine Verbindung erfolgreich zustande gekommen ist OnReceive Diese Nachricht zeigt an, daß Daten empfangen worden sind und im Empfangspuffer abholbereit vorliegen OnSend Zeigt an, daß sich Daten im Sendepuffer befinden und der Socket bereit ist, über die bestehende Verbindung zu senden Tabelle 8-2: Socket-Ereignisse 42 Kapitel 8 Das Programm Systemdetector 8.2 Die Dialogfelder Die Dialogfelder bilden die Benutzungsschnittstelle. Ihre Aufgabe ist es die Programmdaten visuell darzustellen. Der Benutzer kann über die Dialogfelder auch Daten eingeben oder über Schaltflächen Anweisungen an das Programm geben. Die Applikation besitzt drei Dialogfelder (vgl. Abbildung 8-14). Start Haupt-Dialog Details-Dialog Programmende OptionenDialog Abbildung 8-14: Dialogfelder 8.2.1 Der Hauptdialog Der Hauptdialog ist das erste sichtbare Dialogfeld nach einem Programmstart (vgl. Abbildung 8-15). Abbildung 8-15: Hauptdialog 43 Kapitel 8 Das Programm Systemdetector Dies ist das zentrale Fenster, in dem die wichtigsten Programmdaten dargestellt werden. Die anderen Dialogfelder sind von hier aus erreichbar. In dem Listenfeld wird die aktuelle Liste des Rechnerverbundes angezeigt. Zusätzlich sind alle Rechner aufgeführt, die überhaupt in diesem Netzwerk konnektierbar sind. In der ersten Spalte ist die IP-Adresse des jeweiligen Rechners eingetragen. In der zweiten Spalte steht der vollständige Hostname, falls für die IP-Adresse ein Hostname im DNS-Server (vgl. Kapitel 4.3) eingetragen ist. Bei den Rechnern, auf denen die Applikation vorhanden ist, wird nur der Hostname ohne die Domäne eingetragen. In der letzten Spalte wird der Name des angemeldeten Benutzers auf dem jeweiligen Rechner eingetragen, falls die Applikation läuft. Das dargestellte Symbol in der ersten Spalte gibt den Status des Rechners an (vgl. Tabelle 8-3). Symbol Bedeutung Applikation läuft, Auslastung < 33% grün Applikation läuft, Auslastung 33% - 66% gelb Applikation läuft, Auslastung > 66% rot grün Applikation läuft, Bildschirmschoner aktiv, Auslastung < 33% gelb Applikation läuft, Bildschirmschoner aktiv, Auslastung 33% - 66% rot Applikation läuft, Bildschirmschoner aktiv, Auslastung > 66% Applikation läuft nicht grau durchgestrichen unbestimmt Rechner nicht mehr erreichbar Status noch nicht bestimmt Tabelle 8-3: Symbole der Rechnerliste Durch das Klicken mit der linken Maustaste auf die Spaltenköpfe wird die Liste nach dieser Spalte aufwärts sortiert. Neue Rechner werden daraufhin automatisch an die richtige Stelle in der Liste eingefügt. Standardmäßig ist die Sortierung nach der IPAdresse eingestellt. 44 Kapitel 8 Das Programm Systemdetector Das Dialogfeld besitzt zwei Schaltflächen auf denen das graue Rechnersymbol und das durchgestrichene Rechnersymbol abgebildet sind. Die Darstellung dieser Rechnertypen in der Rechnerliste läßt sich mit diesen Schaltflächen ein- bzw. ausschalten. Die Schaltfläche Einstellungen blendet den Optionen-Dialog ein (vgl. Abbildung 8-15). Die Schaltfläche Details öffnet das Details-Dialogfeld, in dem die gesamten Systemdaten des Rechners angezeigt werden, der im Listenfeld ausgewählt ist (vgl. Abbildung 8-15). Falls kein Rechner markiert ist, wird kein Details-Fenster geöffnet. Eine mehrfache Auswahl im Listenfeld ist nicht möglich. Zur Anzeige der Daten wird der Details-Dialog als modales Fenster erzeugt. Anstatt auf die Schaltfläche zu klicken, bietet ein Doppelklick auf den jeweiligen Rechner die gleiche Funktion. Der Haupt-Dialog besitzt einen Fortschritts-Balken, der die momentane ProzessorAuslastung anzeigt. Die Anzeige wird periodisch aktualisiert. Der Intervall-Wert kann vom Benutzer eingestellt werden (vgl. Kapitel 8.2.3). Die Schaltfläche Beenden verläßt das Programm. Wird diese Schaltfläche betätigt, so erscheint ein neues Fenster, in dem man den Vorgang bestätigt werden muß. Beim Beenden des Programms werden alle Threads beendet, die Ausgabedatei wird geschlossen und temporäre Dateien werden gelöscht. 8.2.2 Der Details-Dialog Der Details-Dialog dient zur Darstellung des kompletten Datensatzes eines Rechners. Dazu besitzt das Dialogfeld 22 Felder, in denen Werte eingetragen sind (vgl. Abbildung 8-16). Es befinden sich hier statische und dynamische Daten (vgl. Anhang A), die vom jeweiligen Rechner selber bestimmt worden sind. Die Felder Verbindungsbandbreite und Letztes Lebenszeichen bilden eine Ausnahme. Diese Daten werden immer vom lokalen System bestimmt. Die Verbindungsbandbreite gibt den Datendurchsatz auf Applikationsebene an, der über das Netzwerk erreicht werden kann. Dieser Wert ist ein Maß für die Geschwindigkeit des Netzwerks und der beteiligten Rechnersysteme, welcher nur bestimmt werden kann, wenn auf dem System die Applikation läuft. In dem Feld Letztes Lebenszeichen wird der Zeitpunkt eingetragen, an dem das letzte Mal ein Ping (vgl. Kapitel 6.1) erfolgreich war, oder ein Systemdatenpaket eingetroffen ist. Die Schaltfläche Schließen beendet diesen Dialog und der Benutzer kehrt dadurch zum Haupt-Dialog zurück. 45 Kapitel 8 Das Programm Systemdetector Abbildung 8-16: Details-Dialog 8.2.3 Der Optionen-Dialog Diese Dialogfeld dient zur Einstellung der Programmparameter (vgl. Kapitel 8.4). Diese Programmparameter werden in der Konfigurationsdatei sd.ini im MS WindowsVerzeichnis gespeichert und zu Programmbeginn geladen (vgl. Kapitel 8.1.1.2). Die Parameterwerte sind in Eingabefeldern dargestellt, die vom Benutzer verändert werden können (vgl. Abbildung 8-17). Zusätzlich zu den Parameter-Feldern sind in diesem Dialogfeld vier Schaltflächen angeordnet. Durch die Betätigung der Schaltfläche Scanner starten, wird der Scanner manuell gestartet. Falls der Scanner noch laufen sollte, ist die Schaltfläche deaktiviert dargestellt und läßt sich somit nicht betätigen. Die Schaltfläche History löschen löscht die komplette Rechner-Liste im Speicher, danach wird die Ausgabedatei gelöscht. Diese Funktion wird benötigt, um eine Rechner-Liste neu zu initialisieren. Damit die Funktion nicht versehentlich ausgeführt wird, folgt auf den Klick auf die Schaltfläche eine Sicherheitsabfrage, die bestätigt werden muß. 46 Kapitel 8 Das Programm Systemdetector Abbildung 8-17: Optionen-Dialog Die Schaltfläche Abbrechen schließt das Dialogfeld und verwirft alle Änderungen, OK übernimmt alle geänderten Parameter aus den Eingabefeldern und schließt den Dialog. 8.2.4 Der About-Dialog Dieser Dialog informiert den Benutzer des Programmes über die Version und den Autor des Programmes und die geltenden Copyright-Bestimmungen (vgl. Abbildung 8-18). Abbildung 8-18: About-Dialog 47 Kapitel 8 Das Programm Systemdetector 8.3 Die Ausgabedatei In der Ausgabedatei werden sämtliche Daten, die in der Rechner-Liste erfaßt sind, gespeichert. Damit die Daten in der Datei möglichst den gleichen Stand besitzen, wie die Daten im Hauptspeicher, wird die Ausgabedatei jedes mal aktualisiert, wenn sich ein Wert in der Rechner-Liste ändert oder wenn ein Rechner neu hinzugefügt wird. Um die Ausgabedatei später mit dem Programm MS Excel auswerten zu können, wird das Dateiformat CSV verwendet. Beim CSV-Format handelt es sich um das einfachste Format um Tabellen zu speichern. Dabei werden Spalten durch ein Semikolon getrennt. Für eine neue Zeile wird ein CR-Zeichen eingefügt (vgl. Abbildung 8-19). Abbildung 8-19: CSV-Datei betrachtet im Editor Diese Datei kann mit MS Excel ausgewertet werden (vgl. Abbildung 8-20): Abbildung 8-20: CSV-Datei betrachtet in MS Excel 48 Kapitel 8 Das Programm Systemdetector In der Ausgabedatei werden alle statischen und dynamischen Daten jedes bekannten Rechners abgespeichert. Die Reihenfolge und die Bedeutung der Daten kann Tabelle A-1 entnommen werden. 8.4 Die Konfigurationsdatei Die Programmparameter die beim Start der Applikation geladen werden befinden sich in der Konfigurationsdatei sd.ini im MS Windows-Verzeichnis. Bei diesem Dateityp werden die einzelnen Einstellungen in Gruppen zusammengefaßt. Die Datei sd.ini besitzt die beiden Gruppen Intervalle und Ausgabedatei (vgl. Abbildung 8-21), die Reihenfolge der Parameter kann dabei beliebig sein. Abbildung 8-21: Ansicht von sd.ini im Editor Für jeden Eintrag in der Konfigurationsdatei existiert ein Eingabefeld im OptionenDialog. Die Parameternamen in der Datei werden zu den Feldern im Dialogfeld (vgl. Abbildung 8-17) nach Tabelle 8-4 zugeordnet. Gruppe in sd.ini Intervalle Intervalle Intervalle Intervalle Intervalle Intervalle Intervalle Intervalle Ausgabedatei Name in sd.ini Lebenszeichen Datenaustausch Scanner CPU Info Feldanzeige Benchmark Ping Name Bezeichnung im Dialogfeld Host nicht erreichbar Datenaustausch-Intervall Scanner-Intervall CPU-Monitor-Intervall Systemdaten-Intervall Feldanzeige-Intervall Benchmark-Intervall Ping-Timeout Name der Ausgabedatei Tabelle 8-4: Parameternamen 49 Kapitel 8 Das Programm Systemdetector Für jeden Programmparameter, der im Optionen-Dialog eingestellt werden kann, ist ein Wertebereich und einen Standardwert definiert (vgl. Tabelle 8-5). Der Wertebereich begrenzt die Einstellmöglichkeiten des Parameters, um die Anwendung vor nicht sinnvollen Einstellungen, wie z.B. ein negativer Intervallwert, zu schützen. Die Standardwerte werden eingesetzt, falls zu Programmbeginn ein oder mehrere Werte nicht aus der Konfigurationsdatei geladen werden können. Parameter Host nicht erreichbar Standard -Wert 10 min DatenaustauschIntervall Scanner-Intervall 10 s CPU-Monitor Intervall 3s 5 min Systemdaten-Intervall 60 s Feldanzeige-Intervall 10 s Benchmark-Intervall 60 min Ping-Timeout Name der Ausgabedatei 500 ms Cluster.csv WerteBedeutung Bereich 10-1000 min Ist das letzte Lebenszeichen älter als diese Zeitschranke, gilt der Host als nicht erreichbar 1-100 s Abstand zwischen den Sendungen der eigenen Systemdaten 1–1000 min Abstand zwischen den Starts des Scanners 1-1000 s Länge der Warteschleife zwischen der Abfrage der momentanen CPU-Last 1-1000 s Länge der Warteschleife zwischen der Abfrage der dynamischen Systemdaten Zeitgrenze, nach der die Anzeige 1-100 s der Rechnerliste spätestens aktualisiert wird 1-1000 min Abstand der BenchmarkMessungen 10-5000 ms Ping-Timeout Name der CSV-Datei Tabelle 8-5: Parameter-Einstellungen 8.5 Die Objekte der Applikation Die Applikation Systemdetector ist mit dem MS Visual Studio Compiler implementiert worden. Die in der Klassenansicht dargestellten Klassen (vgl. Abbildung 8-22) zeigen lediglich die neu entwickelten Klassen. Diese werden im allgemeinen von übergeordneten 50 Kapitel 8 Das Programm Systemdetector Klassen der MFC1 abgeleitet und mit neuen Methoden ergänzt. Die verwendeten Klassen der MFC sind dabei nicht mit abgebildet. Abbildung 8-22: Klassenansicht Systemdetector 8.5.1 Die Strukturen der Applikation 8.5.1.1 _host_liste Diese Datenstruktur wird verwendet, um die Daten aller Rechner im Netzwerk festzuhalten. Da jeder theoretisch mögliche Rechner im Netzwerk qualifiziert werden muß, wird für jeden Host eine solche Datenstruktur angelegt (vgl. Abbildung 8-23). Abbildung 8-23: Struktur _host_liste Die Variable applikation gibt an, ob auf dem Rechner das Programm Systemdetector läuft. Ping zeigt an, ob der jeweilige Rechner über ein Ping konnektierbar ist. Falls die Applikation auf einem Rechner läuft, so ist er natürlich auch über ein Ping erreichbar. Die Variable benchmarked gibt an, ob für den jeweiligen Host schon eine Messung der Verbindungs-Bandbreite durchgeführt worden ist und in ip ist die IP-Adresse des Rechners eingetragen. 1 MFC – Microsoft Foundation Class 51 Kapitel 8 Das Programm Systemdetector 8.5.1.2 _rechner In dieser Datenstruktur werden die statischen und dynamischen Systemdaten, die Verbindungsbandbreite und das letzte Lebenszeichen erfaßt (vgl. Abbildung 8-24). Diese Struktur wird für jeden erreichbaren Rechner im Netzwerk benutzt, unabhängig davon, ob er zum Rechnerverbund gehört, oder nicht. Abbildung 8-24: Struktur _rechner 8.5.2 Die Klassenbeschreibung 8.5.2.1 CAboutDlg Diese Klasse hat die Funktion das About-Dialogfeld darzustellen (vgl. Kapitel 8.2.4). Der Anwender erfährt durch das Dialogfeld Informationen über das Programm. Die Klasse CAboutDialog wird von der MFC-Klasse CDialog abgeleitet und wird automatisch bei der Euzeugung eines neuen Projektes vom Compiler erstellt. CDialog ist eine Standardklasse zur Darstellung von Dialogfeldern. 52 Kapitel 8 Das Programm Systemdetector 8.5.2.2 CDetailsDialog Zur Darstellung des Details-Dialogs (vgl. Kapitel 8.2.2) wird diese Klasse verwendet, die ebenfalls von der MFC-Klasse CDialog abgeleitet wird. Diese Klasse hat keine eigenen Funktionen, außer der Möglichkeit, Daten von einer aufrufenden Klasse zu empfangen. Falls das Details-Dialogfeld im Programmablauf aufgerufen wird, so müssen die Daten, die im Dialogfeld eingetragen werden sollen, vorher übergeben worden sein. Diese Funktion wird beim Erstellen der Klasse automatisch vom Klassenassistent von MS Visual Studio eingefügt. Es muß lediglich angegeben werden, welche Daten vom bzw. zum Dialogfeld ausgetauscht werden. 8.5.2.3 CDynamicDataThread Diese Klasse implementiert den System-Daten-Thread (vgl. 8.1.2.3). Sie ist abgeleitet von der MFC-Klasse CWinThread, welche eine Standardklasse für nebenläufige Ausführungspfade darstellt. CDynamicDataThread besitzt eine Funktion, in der zyklisch die dynamischen Daten des lokalen Rechners erfaßt werden. 8.5.2.4 COptionsDialog Diese Klasse hat die Funktion den Optionen-Dialog darzustellen (vgl. Kapitel 8.2.3). Sie ist, wie die anderen Dialogfeldklassen auch, von der MFC-Klasse CDialog abgeleitet. COptionsDialog besitzt die Funktion OnHistory, um sämtliche Rechnerdaten und die Ausgabedatei zu löschen. Diese Funktion wird verwendet, um die Rechnerliste neu zu initialisieren. Die Klasse besitzt die Funktion OnScannerButton, um den Scanner manuell zu starten. Außerdem werden Funktionen bereitgestellt, welche die Änderung der Programmeinstellungen ermöglichen. 8.5.2.5 CScannerThread CScannerThread ist von der MFC-Klasse CWinThread abgeleitet und implementiert die Ausführungspfade des Scanners (vgl. Kapitel 6). Für jede IP-Adresse im lokalen Netzwerk wird ein Thread vom Typ CScannerThread gestartet. Dieser Pfad soll für eine IP-Adresse herausfinden, ob der Host konnektierbar ist, bzw. ob die Applikation auf dem jeweiligen Host läuft. Danach wird der Thread wieder beendet. 8.5.2.6 CServerSocket Diese Klasse ist von der MFC-Klasse CAsyncSocket abgeleitet und implementiert einen asynchronen Socket (vgl. Kapitel 8.1.2.4). Die Funktionen der Klasse dienen nur der Überwachung des Sockets. Hier können Socket-Fehlermeldungen abgefangen und behandelt werden ohne sie an den Hauptdialog zu melden. Bei der Erzeugung einer Variable vom Typ CServerSocket wird automatisch ein neuer Thread gestartet. Diese Funktion ist bereits in der Klasse CAsyncSocket implementiert. 53 Kapitel 8 Das Programm Systemdetector 8.5.2.7 CSysInfoThread Diese Klasse bildet den Ausführungspfad der als CPU-Thread bezeichnet wird (vgl. Kapitel 8.1.2.2). Wie die anderen Thread-Klassen ist auch diese von der MFC-Klasse CWinThread abgeleitet. Die Hauptfunktion dieses Threads ist die periodische Abfrage der CPU-Auslastung, des Bildschirmschoner- und des Scanner-Status. 8.5.2.8 CSystemdetectorApp Diese Klasse wird vom Compiler bei der Erzeugung eines neuen Projekts automatisch erstellt. Sie ist nur für den Start der Applikation verantwortlich und besitzt keine programmrelevanten Funktionen. 8.5.2.9 CSystemdetectorDlg CSystemdetector stellt die wichtigste Klasse der Applikation dar. In ihr ist die Darstellung des Hauptdialogfeldes implementiert. Die Klasse besitzt die Funktionen, um alle statischen und dynamischen Daten des eigenen Systems zu bestimmen. Die gesammelten Daten aller Rechner werden hier gesammelt. Die Kommunikation mit anderen Rechnern wird ebenfalls von ihr gesteuert. Darüber hinaus sind die Funktionen für die Erstellung der Ausgabedatei in dieser Klasse vorhanden. Die Klasse CSystemdetector implementiert die meisten Funktionen des Haupt-Threads und stellt das zentrale Steuerorgan der Applikation dar. 54 Kapitel 9 Tests 9 Tests Um die einwandfreie Funktionalität des Programmes Systemdetector zu testen, sind mehrere Tests durchgeführt worden (vgl. Kapitel 5.9). 9.1 Applikationsstabilität prüfen Bei diesem Test ist das Verhalten des Programmes in Bezug auf die eigenen Systemressourcen und vor allen Dingen die Stabilität getestet worden. Dazu ist das Programm auf nur einem einzigen Rechner gestartet worden, der sich in einem Netzwerk befindet. Das Verhalten des Programms wird getestet, ohne das eine Kommunikation mit anderen Systemen stattfindet. Der Test zeigt, daß die Applikation über einen längeren Zeitraum stabil läuft. Es ist eine Testdauer von 3 Tagen, unter Verwendung des Testsystems Thriller (vgl. Anhang C), angesetzt worden. Während dieses Zeitraums sind mehrere Systemdaten mit dem Systemmonitor von Windows NT mitprotokolliert worden (vgl. Abbildung 9-1). Abbildung 9-1: Screenshot Systemmonitor 55 Kapitel 9 Tests Aus dem Verlauf dieser Werte, kann ein Rückschluß auf die Stabilität und das Systemverhalten der Applikation gezogen werden. Der Systemmonitor erfaßt für den Prozeß Systemdetector fünf verschiedene Systemdaten. Die Bedeutung dieser Daten kann Tabelle 9-1 entnommen werden. Protokollierter Wert Beschreibung Thread-Anzahl Anzahl der parallelen Ausführungspfade Virtuelle Größe Dies ist die aktuelle Größe des virtuellen Adressraums, den dieser Prozeß belegt. Private Seiten Dies ist die aktuelle Anzahl an Speicherseiten, die der Prozeß reserviert hat und die nicht mit anderen Prozessen geteilt werden kann. % Prozessorzeit Dieser Wert ist der Prozentanteil der vergangenen Zeit, während der alle Threads dieses Prozesses den Prozessor verwendet haben, um Instruktionen auszuführen. Tabelle 9-1: Protokollierte Prozeßdaten Aus den Daten virtuelle Größe (oberste Kurve) und private Seiten (2. Kurve von oben) können Rückschlüsse auf das Speicherverhalten des Prozesses gezogen werden. Da diese Daten über den gesamten Testverlauf einen konstanten Wert aufweisen (vgl. Abbildung 9-1), kann die Applikation als "stabil", bezogen auf den Speicherbedarf, betrachtet werden. Ein Prozeß, der während der Laufzeit zunehmend Speicher für sich beansprucht, gilt als "instabil", da das Betriebssystem nur einen endlichen Wert an Speicherseiten bereitstellen kann. Eine Applikation, die so viel Speicher für sich beansprucht, daß der maximale Wert für das jeweilige System überschritten wird, erzwingt damit mindestens einen Absturz der Applikation, oder sogar einen Absturz des Betriebsystems. Durch den Wert Thread-Anzahl (unterste Kurve) läßt sich beobachten, ob die dynamisch erzeugten Threads, die mit dem Scanner gestartet werden (vgl. Kapitel 6), wieder beendet werden. Da dieser Wert einen konstanten Verlauf über den gesamten Testlauf aufweist, werden offensichtlich die Threads immer ordnungsgemäß beendet. Durch den Wert Prozessorzeit (2. Kurve von unten, leicht schwankend) kann die Belastung der lokalen CPU durch diesen Prozeß beobachtet werden. Wie sich erkennen läßt, benötigt die Applikation Systemdetector sehr wenig Prozessorzeit. Die Belastung liegt auf dem verwendeten Testsystem durchschnittlich bei unter 5%. Es ist jedoch zu beobachten, daß zu Anfang und am Ende des Testlauf die Prozessorlast ansteigt. Der Grund dafür liegt im jeweiligen Zustand des Netzwerks. Am Anfang bzw. am Ende des Tests waren im gleichen Netzwerk zusätzliche andere Rechner konnektierbar. Diese Rechner werden von der Applikation Systemdetector durch den 56 Kapitel 9 Tests Scanner erfaßt und im Dialogfeld dargestellt. Dadurch wird der lokale Prozessor zusätzlich minimal belastet, wodurch sich der kleine Anstieg der Prozessorzeit erklären läßt. Nach Ablauf des Test sind die Funktionen und die Darstellung der Dialogfelder überprüft worden (vgl. Abbildung 9-2). Abbildung 9-2: Screenshot Systemdetector Die vier Dialogfelder, alle Schaltflächen und die Bestimmung der eigenen Systemdaten funktionierten nach Ablauf des Testzeitraums einwandfrei. Die konnektierbaren Rechner sind fehlerfrei erfaßt und in das Listenfeld im Hauptdialog eingetragen worden. Aus diesen Ergebnissen läßt sich schlußfolgern, daß nach Ablauf des dreitägigen Test die Applikation ohne funktionelle Einschränkung arbeitet. 9.2 Erkennen aller Rechner im Netzwerk In diesem Test ist der Schwerpunkt auf die Scanner-Funktion (vgl. Kapitel 6) gelegt worden, d.h. auf die Netzwerkfunktionen. Beim Start der Applikation Systemdetector muß der Scanner alle anderen Rechner im Netzwerk, die konnektierbar sind, erkennen 57 Kapitel 9 Tests und im Dialogfeld dementsprechend anzeigen (vgl. Kapitel 8.2.1). Um alle Hosts zu bestimmen, die tatsächlich im Netzwerk erreichbar sind, wird das Referenzprogramm WS_PingProPack von der Firma IP-Switch verwendet. Dieses Programm bestimmt alle konnektierbaren Hosts und gibt den Namen für die jeweilige IP-Adresse an, die im DNS-Server gespeichert ist (vgl. Abbildung 9-3). Abbildung 9-3: Screenshot WS_PingProPack Das Listenfeld im Hauptdialog des Programms Systemdetector kann nicht alle Hosts gleichzeitig darstellen. Deshalb wird zur Auswertung die Ausgabedatei in MS Excel verglichen (vgl. Abbildung 9-4). Die Daten in der Ausgabedatei laufen zu den Daten des Dialogfeldes immer synchron. Die beiden Rechnerlisten stimmen überein. Daraus kann gefolgert werden, das der Scanner, sowie Namensauflösung der IP-Adressen einwandfrei funktionieren. Aus der Tatsache, daß MS Excel die Ausgabedatei fehlerfrei auswerten konnte, ist zusätzlich die Ausgabedatei auf Korrektheit geprüft worden. 58 Kapitel 9 Tests Abbildung 9-4: Screenshot MS Excel 9.3 Zusammenschluß mehrerer Rechner Bei diesem Test befanden sich insgesamt drei Rechner im Netzwerk, auf denen die Applikation im Abstand von wenigen Sekunden gestartet worden ist. Das Programm muß auf jedem dieser Rechner in der Lage sein, die anderen Rechner mit dem Scanner zu finden und daraufhin die Systemdaten mit ihnen auszutauschen. Außerdem müssen die Verbindungsbandbreiten zwischen den Rechnern bestimmt werden. Dazu sind die Testsysteme Thriller, Thing und Theory verwendet worden, auf denen ca. 3 Tage die Applikation lief. Wie beim Test in Kapitel 9.1 ist zur Stabilitätsüberprüfung ebenfalls der Systemmonitor von Windows NT herangezogen worden, der einige Systemdaten mitprotokolliert (vgl. Abbildung 9-5). 59 Kapitel 9 Tests Abbildung 9-5: Screenshot Thriller Das Verhalten der Applikation ist exemplarisch auf dem Testsystem Thriller genauer ausgewertet worden. Auf den anderen beiden Testsystemen zeigte die Applikation das gleiche Verhalten, da die protokollierten Daten im Systemmonitor qualitativ auf allen drei Systemen den gleichen Verlauf hatten. Die Daten Virtuelle Größe (oberste Kurve) und Private Seiten (2. Kurve von oben) zeigen einen konstanten Verlauf (vgl. Abbildung 9-5). Dem Programm kann ein stabiles Speichermanagement bescheinigt werden, da mit der Laufzeit kein zusätzlicher Speicher verwendet wird. Die Thread-Anzahl (unterste Kurve) bleibt ebenfalls konstant im gesamten Testverlauf (vgl. Abbildung 9-5). Daran läßt sich erkennen, daß die gestarteten Ausführungspfade des Scanners (vgl. Kapitel 6) auch wieder beendet werden. Der Verlauf der Prozessorzeit (2. Kurve von unten) zeigt einen schwankenden Verlauf (vgl. Abbildung 9-5). Tagsüber liegt eine Erhöhung der Prozessorlast vor. Der Grund besteht darin, daß während dieser Zeit mehr Rechner im lokalen Netzwerk konnektierbar sind (vgl. Kapitel 9.1). Nach Ablauf des Testzeitraums ist auf allen drei Systemen die Funktionen der Dialogfelder, die Datenausgabe im Dialogfeld (vgl. Abbildung 9-6) und die Erstellung der Ausgabedatei auf Korrektheit überprüft worden. 60 Kapitel 9 Tests Abbildung 9-6: Screenshot Thriller Aus den Testergebnissen läßt sich schlußfolgern, daß die Applikation nach dem dreitätigen Test auf allen Systemen einwandfrei funktioniert. 9.4 Ordentliches Beenden des Programmes In einem Netzwerk befinden sich für diesen Test zunächst fünf Rechner auf denen die Applikation läuft. Alle Rechner tauschen untereinander erfolgreich periodisch die Systemdaten aus. In der Rechnerliste werden die beteiligten Rechner mit farbigen Symbolen gekennzeichnet (vgl. Tabelle 8-3). Am Test sind dazu die Systeme Theory, Thing, Theorem, Theme und Thread beteiligt (vgl. Abbildung 9-7). Auf dem Rechner Thing wird nun die Applikation beendet. Die Applikationen der anderen Rechner müssen dies erkennen und Thing nur noch als konnektierbar einstufen. Er muß in der Rechnerliste als grauer Rechner dargestellt werden und nicht mehr mit farbigem Symbol. Außerdem wird der Rechner-Name von Thing mit vollem Domain-Namen angegeben und der Benutzername gelöscht (vgl. Abbildung 9-8). 61 Kapitel 9 Tests Abbildung 9-7: Screenshot Theorem Abbildung 9-8: Screenshot Theorem 62 Kapitel 9 Tests Da die Systemdaten von Thing nicht mehr bestimmt werden können, müssen die alten Daten aus der Rechnerliste gelöscht werden. Lediglich die Adresse, der Hostname und das letze Lebenszeichen werden gespeichert (vgl. Abbildung 9-9). Abbildung 9-9: Screenshot Details-Dialog 9.5 Programmabsturz simulieren Ausgehend von einem bestehenden Rechnerverbund wird der Fall des Programmabsturzes simuliert. Dazu wird auf einem Rechner die laufende Applikation mittels des Task-Managers von Windows NT „gewaltsam“ beendet. Die Applikationen auf den anderen Rechnern erkennen jetzt, daß die abgestürzte Applikation nicht mehr erreichbar ist. Dies bedeutet, daß der betroffene Rechner aus dem Rechnerverbund gelöscht werden muß. Der Programmabsturz darf auf anderen Rechnern keine Fehlfunktionen hervorrufen. Am Test sind dazu die Systeme Thing und Theory beteiligt, die erfolgreich einen Verbund gebildet haben (vgl. Abbildung 9-10). Auf Thing wird nun mittels des Task-Managers der Prozeß Systemdetector beendet. Der Rechner soll jedoch regulär weiterlaufen, damit er über das Netzwerk immernoch erreichbar ist. Theory muß diesen Fall behandeln, wie ein reguläres Beenden der Applikation und den Rechner Thing als graues Symbol darstellen, da der Host immernoch konnektierbar ist (vgl. Abbildung 9-11). 63 Kapitel 9 Tests Abbildung 9-10: Screenshot Theory Abbildung 9-11: Thing als graues Symbol 64 Kapitel 9 Tests Die Applikation auf dem System Theory hat korrekt erkannt, daß auf dem Rechner Thing die Applikation nicht mehr läuft. Der Host Thing wird als konnektierbar eingestuft und mit grauem Symbol dargestellt. In der Rechnerliste wird der Benutzername gelöscht und der Rechnername mit dem Domain Namen ergänzt. 9.6 Netzwerkstörung simulieren In diesem Test wird in einem existierenden Rechnerverbund die Kommunikation gestört, indem die Netzwerkleitungen der Rechner getrennt werden. Dadurch ist eine Kommunikation zwischen den Applikationen unmöglich. Die Programme müssen jetzt erkennen, daß der Rechnerverbund aufgelöst worden ist. Von jedem Rechner aus betrachtet ist kein anderer Rechner mehr konnektierbar. Nach Ablauf der Zeitgrenze für Host nicht erreichbar (vgl. Kapitel 8.2.3) müssen die nicht erreichbaren Rechner als durchgestrichene Rechnersymbole im Listenfeld dargestellt werden (vgl. Tabelle 8-3). An diesem Test sind die beiden Testsysteme Theory und Thread beteiligt, die einen Rechnerverbund bilden. Zusätzlich befinden sich zahlreiche andere Hosts im Netzwerk (vgl. Abbildung 9-12). Abbildung 9-12: Screenshot Theory 65 Kapitel 9 Tests An den beiden Systemen Theory und Thread werden nun die Netzwerkkabel abgezogen, um die Störung zu simulieren. Der Rechnerverbund sollte nach kurzer Zeit als aufgelöst dargestellt werden. Zusätzlich müssen nach Ablauf der Zeitgrenze für Host nicht erreichbar alle Rechner im Netzwerk als durchgestrichener Rechner dargestellt werden (vgl. Abbildung 9-13). Abbildung 9-13: Screenshot Thread Der Host Thread hat richtig erkannt, daß kein Rechner im Netzwerk erreichbar ist. Deshalb werden alle Systeme korrekt mit dem durchgestrichenen Rechnersymbol dargestellt. Auf dem Rechner Theory liegen gleiche Ergebnisse vor. Die Funktionen der Applikation sind durch die Trennung vom Netzwerk nicht beeinträchtigt worden. Die Anwendungen laufen auf beiden Testsystemen weiterhin stabil. 66 Kapitel 10 Probleme und Ausblick 10 Probleme und Ausblick Bei den in Kapitel 9 beschriebenen Testläufen sind einige Probleme hinsichtlich der Bestimmung der Verbindungs-Bandbreite deutlich geworden. Um zu einem relativ genauen Meßergebnis zu gelangen, muß die Paketgröße, die über das Netzwerk gesendet wird, sehr groß sein. Dabei wachsen die Übertragungszeiten proportional zur Paketgröße an. Der Fehler durch die Meßungenauigkeit bei der Zeitmessung wird mit zunehmender Paketgröße kleiner. Probleme treten jedoch auf, wenn zum gleichen Zeitpunkt ein anderer Rechner das Netzwerk stark belastet, z.B. wenn eine andere Applikation gerade eine Performance-Messsung durchführen. Dadurch werden die Meßergebnisse verfälscht. Je länger die Messung andauert, desto größer ist die Wahrscheinlichkeit, daß diese Messung gestört wird. Dies steht im Gegensatz zu dem Wunsch einer langen Meßdauer, um die Zeit-Meßungenauigkeiten zu minimieren. Es muß also ein gesundes Mittelmaß gefunden werden. Das Programm Systemdetctor verwendet zur Performance-Messung eine Paketgröße von 100 KByte. In einem 10 Mbit Netzwerk dauert die Übertragung bei idealen Voraussetzungen ca. 80 ms. Der verwendete Zeitmesser hat eine Auflösung von 1 ms, wodurch der Meßfehler kleiner als 10% sein sollte. In der Praxis sind jedoch deutliche Schwankungen in der Performance gemessen worden, wenn andere Rechner sehr aktiv waren. Die ermittelte Verbindungs-Bandbreite muß deshalb mit großer Vorsicht betrachtet werden. Zur Verbesserung der Ergebnisse müßte ein Verfahren entwickelt werden, daß Störfaktoren, wie z.B. ein stark belastetes Netzwerk ausschließen kann. Das entwickelte Programm ist derzeit nur auf einem MS Windows NT System lauffähig, da zur Bestimmung von einigen Systemdaten auf spezielle MS Windows NT Funktionen zurückgegriffen wird. Da die meisten Programmfunktionen generell auf Win32 Systemen arbeiten, ist eine Portierung der Anwendung auf Win95/98 Systeme möglich. Lediglich die NT-spezifischen Funktionen müssen dabei ersetzt werden. Die Systemdaten, die für einen Rechner gesammelt werden, geben immer die aktuellen Momentanwerte an. Ältere Werte werden nicht gespeichert, sondern periodisch durch neue ersetzt. Deshalb ist es nicht möglich den zeitlichen Verlauf, oder den Mittelwert eines Datums über einen gewissen Zeitraum darzustellen. Um dies zu ermöglichen, müßten mehrere Werte für die jeweiligen Systemdaten gespeichert werden. 67 Kapitel 11 Literatur 11 Literatur [CHA98] Chapman, Davis Visual C++ 6 in 21 Tagen SAMS, Haar 1998 ISBN 3-8272-2035-1 [INS98] Microsoft Press Inside Visual C++ 6.0 Microsoft Press, Unterschleißheim 1998 ISBN 3-86063-461-5 [LIB98] Microsoft Press Microsoft Visual C++ 6.0 Reference Library Microsoft Press, Redmond 1998 ISBN 1-57231-865-1 [MIC98] Microsoft Press Microsoft Visual C++ 6.0 Programmierhandbuch Microsoft Press, Unterschleißheim 1998 ISBN 3-86063-054-7 [MIN98] Minasi, Mark Windows NT Server 4 Sybex, Düsseldorf 1998 ISBN 3-8155-5516-7 [QUI96] Quinn, Bob / Shute, Dave Windows Sockets Network Programming Addison-Wesley, Reading 1996 ISBN 0-201-63372-8 [SCH99] Schüppel, Volker Erstellen einer Software zur Performance-Bestimmung einer Netzwerkverbindung Studienarbeit S275, Lehrstuhl für Datenverarbeitung Ruhr-Universität Bochum, Bochum 1999 68 Kapitel 11 Literatur [STE94] Stevens, W. Richard TCP/IP Illustrated, Volume 1 Addison-Wesley, Reading 1994 ISBN 0-201-63346-9 [SWA91] Swan, Tom C++ Lernen Systhema Verlag, München 1991 ISBN 3-89390-268-6 [WAS94] Washburn, Kevin/ Evans, Jim TCP/IP, Aufbau und Betrieb eines TCP/IP-Netzes Addison-Wesley, Bonn 1994 ISBN 3-89319-658-7 69 Inhalt Anhang Inhalt Anhang Anhang A Systemdaten ............................................................................................. 71 Anhang B Multithread-Programmierung ................................................................... 73 Anhang C Testsysteme .............................................................................................. 75 Anhang D Funktionsbeschreibung............................................................................. 76 D-I Klasse CDynamicDataThread ......................................................................... 76 D-II Klasse CScannerThread................................................................................. 76 D-III Klasse CServerSocket ................................................................................... 77 D-IV Klasse CSysInfoThread ................................................................................ 79 D-V Klasse CSystemdetectorDlg ........................................................................... 79 Anhang E Member-Objekte und Objekt-IDs.............................................................. 92 Anhang F Schnittstellen der Klassen ......................................................................... 95 Anhang G Programmstrukturen................................................................................. 97 G-I Klasse CDynamicDataThread ......................................................................... 97 G-II Klasse COptionsDialog.................................................................................. 97 G-III Klasse CScannerThread ............................................................................... 98 G-IV Klasse CSysInfoThread ................................................................................ 99 G-V Klasse CSystemdetectorDlg ........................................................................... 99 70 Anhang A Systemdaten Anhang A Systemdaten d / s1 Beschreibung Kompletter Name, der im DNS für die jeweilige IP eins getragen ist. Bei Rechnern, auf denen die Applikation läuft, wird der Name der Domäne weggelassen. Benutzername Name des Benutzers, der unter Windows NT derzeit s eingeloggt ist. IP-Adresse IP-Adresse. Sollte kein Netzwerk vorhanden ein, so s wird die Loopback-Adresse 127.0.0.1 eingetragen MAC-Adresse Die eindeutige physikalische Netzwerkkarten-Adresse. s Falls sie nicht bestimmbar ist, wird 00:00:00:00:00:00 eingetragen. Subnetzmaske Subnetzmaske. Falls kein Netzwerk vorhanden ist, wird s 255.0.0.0 eingetragen. Netz-Adresse Adresse des gesamten Subnetzes. Wird aus IP-Adresse s und Subnetzmaske gebildet. Betriebssystem s Betriebssystem Prozessorhersteller Herstellername, den das BIOS meldet. Abhängig von s BIOS und CPU. Prozessortyp Gibt die Generation des Prozessors an. Abhängig von s BIOS und CPU. Anzahl der ProzesAnzahl der Prozessoren, die Windows NT erkannt hat. soren s In fehlerhaft konfigurierten Systemen, kann diese Zahl von der tatsächlichen Prozessoranzahl abweichen. Taktfrequenz Gibt die Taktfrequenz des Prozessors an. Abhängig von s BIOS und CPU. d Momentane Prozessorlast Prozessorauslastung s Größe des Applikations-Laufwerks2 Festplattengröße Freier Freier Speicher auf Applikations-Laufwerks d Festplattenplatz Physikalischer RAM, den Windows NT beim Booten erkannt hat. s Speicher Freier physikalischer RAM, der noch nicht vom Betriebssystem oder And Speicher wendungsprogrammen belegt ist. Virtueller Speicher Speicher, den Windows NT inklusive der Auslaged rungsdatei verwenden kann. System-Ressource Rechnername 1 d / s – dynamisch / statisch 2 Applikations-Laufwerk – Das logische Laufwerk von dem die Applikation gestartet worden ist 71 Anhang A System-Ressource Freier virtueller Speicher Bildschirmschoner VerbindungsBandbreite Letztes Lebenszeichen Systemdaten d / s Beschreibung d d d d Freier Speicher, den Windows NT inklusive der Auslagerungsdatei verwenden kann. Gibt den Status des Bildschirmschoners an. Netzwerk-Performance, die auf Anwendungsebene gemessen wird. Zeitpunkt der letzten erfolgreichen Ping-Antwort, oder des letzten Systemdatenpakets. Tabelle A-1: Systemdaten 72 Anhang B Multithread-Programmierung Anhang B Multithread-Programmierung Der Pfad (Faden) der Ausführung durch ein Programm wird als Thread bezeichnet. Er ist die kleinste Ausführungseinheit, die von einem Multitasking-Betriebssystem geplant wird. Ein Thread besteht aus einem Stack, dem Zustand der CPU-Register und einem Eintrag in die Ausführungsliste des System-Schedulers. Jeder Thread teilt alle Ressourcen eines Prozesses. Ein Prozeß besteht aus einem oder mehreren Threads, sowie dem Code, den Daten und anderen Ressourcen eines im Speicher befindlichen Programms (vgl. Abbildung B-1). Prozeß 1 Prozeß 2 Daten Daten Thread 1 Thread 1 Thread 2 Prozeß n ... Thread 3 Daten Thread 1 Thread 2 Abbildung B-1: Threads in Prozessen Typische Programm-Ressourcen sind geöffnete Dateien, Semaphore und dynamisch reservierter Speicher. Ein Programm wird ausgeführt, wenn der System-Scheduler einem seiner Threads die Kontrolle über die Ausführung gibt. Der Scheduler legt fest, welche Threads zu welchem Zeitpunkt ausgeführt werden sollen. Dabei haben Threads mit einer höheren Priorität Vorrang vor denen mit niedrigerer Priorität. Auf Systemen mit mehreren Prozessoren kann zudem der Scheduler einzelne Threads auf verschiedene Prozessoren verteilen, um die CPU-Auslastung auszugleichen. In einem Prozeß laufen die Threads unabhängig voneinander, d.h. solange diese nicht einander "sichtbar" werden, laufen sie einzeln und ohne Kenntnis der anderen ab. Threads, die sich gemeinsame Ressourcen teilen, müssen ihre Arbeit mit Hilfe von Synchronisations-Mechanismen und anderen Formen von Interprozeß-Kommunikation koordinieren. Threads können in zwei unterschiedliche Typen eingeteilt werden. Es gibt worker Threads und user-interface Threads. Ein worker Thread wird hauptsächlich verwendet, um Hintergrundaktionen durchzuführen, die für den Benutzer des Programms nicht sichtbar sind. So kann es sein, daß ein worker Thread auf bestimmte Ereignisse wartet, die nur selten auftreten. In der restlichen Zeit befindet sich ein solcher Ausführungspfad im Wartezustand. Ein User-interface Thread wird hauptsächlich zur Einund Ausgabe von Daten, bzw. zur Darstellung der Benutzungsoberfläche eines Programms verwendet. Er kontrolliert Benutzereingaben über Maus und Tastatur und 73 Anhang B Multithread-Programmierung reagiert individuell auf diese Aktionen. Dieser Thread-Typ befindet sich nie in einem Wartezustand, da für den Benutzer keine Verzögerungen entstehen sollen. Das Programm Systemdetector startet zu Programmbeginn vier Threads. Der HauptThread ist vom Typ user-interface Thread, da er unter anderem die Benutzungsschnittstelle bereitstellt. Bei den drei anderen Ausführungspfaden handelt es sich um worker Threads. Sie bearbeiten lediglich Hintergrundaufgaben. Anhand der Ablaufdiagramme läßt sich erkennen, daß typische Wartezustände in den worker Threads zu finden sind. Während des Programmablaufs findet eine Kommunikation zwischen den einzelnen Threads statt. Dies ist notwendig um den Zustand eines anderen Pfades zu ermitteln, um sich gegenseitig zu synchronisieren oder um auf gemeinsame Daten zuzugreifen. Vor allen Dingen der Zugriff auf gemeinsame Daten stellt ein großes Problem dar, da die Konsistenz der Daten gewährleistet werden muß. Es muß der Fall betrachtet werden, daß verschiedene Threads gleichzeitig den gleichen Code abarbeiten, bzw. die gleichen Daten manipulieren. Dies erfordert eine sehr korrekte und genaue Programmierung. Die MFC bietet Synchronistionsmechanismen, die diese Aufgabe vereinfachen. Hierzu gehören Ereignisse, Semaphore und Mutexe. Ein Ereignis ist eine Nachricht, die an einem bestimmten Thread gesendet werden kann. Der Empfänger-Pfad kann diese Nachricht auswerten und daraufhin eine bestimmte Anweisungsfolge ausführen. Semaphore begrenzen die Anzahl der Threads, die eine bestimmte Ressource verwenden. Ein Semaphor verhindert, daß mehr Pfade auf eine Ressource zugreifen, als maximal erlaubt sind. Sollte ein Thread versuchen auf eine Ressource zuzugreifen, die schon durch die maximal zulässige Anzahl belegt ist, so wird dieser Thread solange blockiert, bis ein Zugriff auf die Ressource wieder möglich ist. Ein Mutex ist ein Synchronisations-Objekt, welches den exklusive Zugriff von einem Pfad auf eine Ressource erlaubt. Mutexe sind sinnvoll, wenn nur einem Thread die Modifikation von Daten erlaubt sein soll. 74 Anhang C Testsysteme Anhang C Testsysteme Name THING THREAD THEME THEOREM THEORY THRILLER CPU Celeron-333 MHz Pentium II-350 Mhz Pentium II-400 Mhz Pentium-133 MHz Pentium II-266 MHz Intel 486-133 MHz Festplatte 911 MB 1,0 GB 1,0 GB 1,2 GB 3,3 GB 811 MB RAM 64 MB 128 MB 64 MB 64 MB 192 MB 48 MB Netzwerkkarte 10 Mbit BNC 10 Mbit BNC 10 Mbit BNC 10 Mbit BNC 10 Mbit BNC 10 Mbit BNC Tabelle C-1: Testsysteme 75 Anhang D Funktionsbeschreibung Anhang D Funktionsbeschreibung D-I Klasse CDynamicDataThread GetData() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Dies ist die Hauptfunktion des Daten-Threads. In einer Endlosschleife wird periodisch der freie Festplattenplatz, der freie Hauptspeicher und der virtuelle Speicher abgefragt. Außerdem wird ein Lebenszeichen für den lokalen Rechner eingetragen. Am Ende der Schleife wird bei jedem Durchlauf gewartet. Die Länge dieser Warteschleife kann in den Programmeinstellungen mit dem Wert Systemdaten-Intervall angegeben werden. SetOwner() Eingabeparameter: CSystemdetecterDlg* pOwner Rückgabeparameter: void Beschreibung: Es wird ein Zeiger auf das aufrufende Dialogfeld gesetzt. Dadurch ist ein Zugriff von diesem Thread auf die Daten des Haupt-Dialogfeldes möglich. D-II Klasse CScannerThread Rechner_abfragen() Eingabeparameter: unsigned int ip int zaehler Rückgabeparameter: void Beschreibung: Diese Funktion überprüft im zweistufigen Verfahren, ob ein entferntes System konnektierbar ist, bzw. ob die Applikation auf dem System läuft. Der erste 76 Anhang D Funktionsbeschreibung Eingabeparameter gibt die IP-Adresse des Hosts an, der zweite Parameter gibt den Index im Rechnerdatenfeld an, in dem die Ergebnisse eingetragen werden. Scanner() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Dies ist die Hauptfunktion des Threads und wird vom Haupt-Thread aus gestartet. Die Funktion ermittelt die nächste IP-Adresse, die vom Scanner überprüft werden muß. Mit dieser Adresse wird dann Rechner_abfragen aufgerufen. SetOwner() Eingabeparameter: CSystemdetecterDlg* pOwner Rückgabeparameter: void Beschreibung: Es wird ein Zeiger auf das aufrufende Dialogfeld gesetzt. Dadurch ist ein Zugriff von diesem Thread auf die Daten des Haupt-Dialogfeldes möglich. D-III Klasse CServerSocket OnAccept() Eingabeparameter: int ErrorCode Rückgabeparameter: void Beschreibung: Diese Funktion akzeptiert eine Verbindungsanfrage auf dem Server-Socket. Der Eingabeparameter übergibt eine Socket-Fehlermeldungen, die hier behandelt wird. Ein Fehlercode von „0“ zeigt an, daß kein Fehler vorliegt. OnClose() Eingabeparameter: int ErrorCode 77 Anhang D Funktionsbeschreibung Rückgabeparameter: void Beschreibung: Eine bestehende Verbindung auf dem Server-Socket wird geschlossen. Die Socket-Fehlermeldung, die über den Eingabeparameter übergeben wird, wird hier ausgewertet. OnConnect() Eingabeparameter: int ErrorCode Rückgabeparameter: void Beschreibung: Diese Funktion wird aufgerufen, wenn eine Verbindung zu einem anderen Rechner auf dem Server-Socket initiiert wird. Der Eingabeparameter übergibt eine Socket-Fehlermeldungen, die hier behandelt wird. Ein Fehlercode von „0“ zeigt an, daß kein Fehler vorliegt. OnReceive() Eingabeparameter: int ErrorCode Rückgabeparameter: void Beschreibung: Hiermit werden Daten aus dem Empfangspuffer des Server-Sockets gelesen. Die Socket-Fehlermeldung, die über den Eingabeparameter übergeben wird, werden ebenfalls in dieser Funktion ausgewertet. OnSend() Eingabeparameter: int ErrorCode Rückgabeparameter: void Beschreibung: Diese Funktion wird aufgerufen, wenn Daten zu einem verbunden Rechner über den Server-Socket gesendet werden. Der Eingabeparameter übergibt eine Socket-Fehlermeldungen, die hier behandelt wird. Ein Fehlercode von „0“ zeigt an, daß kein Fehler vorliegt. 78 Anhang D Funktionsbeschreibung SetParent() Eingabeparameter: CDialog *pWnd Rückgabeparameter: void Beschreibung: Es wird ein Zeiger auf das aufrufende Dialogfeld gesetzt. Dadurch ist ein Zugriff auf die Daten des Haupt-Dialogfeldes möglich. D-IV Klasse CSysInfoThread GetSysInfo() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Dies ist die Hauptfunktion des CPU-Threads. In einer Schleife wird periodisch die CPU-Auslastung, der Status des Bildschirmschoners und der Status des Scanners abgefragt. Am Ende der Schleife wird bei jedem Durchlauf gewartet. Die Länge dieser Warteschleife wird in den Programmeinstellungen als CPUMonitor-Intervall bezeichnet wird. SetOwner() Eingabeparameter: CSystemdetecterDlg* pOwner Rückgabeparameter: void Beschreibung: Es wird ein Zeiger auf das aufrufende Dialogfeld gesetzt. Dadurch ist ein Zugriff von diesem Thread auf die Daten des Haupt-Dialogfeldes möglich. D-V Klasse CSystemdetectorDlg Cluster_ueberpruefen() Eingabeparameter: void Rückgabeparameter: void 79 Anhang D Funktionsbeschreibung Beschreibung: Diese Funktion überprüfung die Rechner, die durch ein erfolgreiches Ping im Netzwerk gefunden worden und als konnektierbar eingestuft worden sind. Dazu wird die aktuelle Systemzeit mit dem Zeitpunkt des letzten Lebenszeichens verglichen. Falls zwischen diesen beiden Zeitpunkten eine Zeitspanne vergangen ist, die größer ist als die Programmoption Host nicht erreichbar, so gilt dieser Rechner nicht mehr als konnektierbar und wird mit dem durchgestrichenen Rechner-Symbol gekennzeichnet. Connect_to_hosts() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Es werden die eigenen Rechnerdaten an alle anderen Systeme gesendet, auf denen die Applikation läuft. Dazu werden die Rechner im Netzwerk nacheinander konnektiert. Um zu erkennen, ob die Applikation auf den anderen Rechnern läuft, werden die Daten verwendet, die der Scanner liefert. Falls ein System zum ersten mal konnektiert wird, so wird kein Systemdatenpaket gesendet, sondern ein Benchmark durchgeführt. Falls zu einem Rechner an dieser Stelle keine Verbindung zustande kommt, so wird dieser Rechner als nur noch erreichbar eingestuft und im der Rechnerliste mit einem grauen Symbol geführt. CSV_Datei() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Speichert die aktuelle Rechnerliste mit allen Systemdaten in der Ausgabedatei im CSV-Format. Der Name der Ausgabedatei kann in den Programmoptionen angegeben werden, der standardmäßig cluster.csv lautet. 80 Anhang D Funktionsbeschreibung CSV_Datei_laden() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Falls eine Ausgabedatei im CSV-Format vorhanden ist, so wird sie am Programmstart mit Hilfe dieser Funktion geladen. Dabei werden aus der Datei nur die Adressen und der Zeitpunkt des letzten Lebenszeichens übernommen. Alle anderen Daten, die in der Ausgabedatei abgelegt sind, werden als veraltet betrachtet und nicht übernommen. Die geladenen Rechner werden in der Rechnerliste mit dem Programmsymbol eingetragen, wodurch angezeigt werden soll, daß der aktuelle Zustand des Systems noch nicht bestimmt worden ist. Der Name der Ausgabedatei kann in den Programmoptionen angegeben werden. Standardmäßig lautet der Name cluster.csv. Daten_aktualisieren() Eingabeparameter: _rechner rechner int typ Rückgabeparameter: void Beschreibung: Diese Funktion aktualisiert die Systemdaten für einen Rechner, der sich bereits im Rechnerfeld befindet. Das bedeutet, daß alle Datenstrukturen für dieses System bereits vorher erstellt worden sind, in denen mindestens die IP-Adresse und das letzte Lebenszeichen eingetragen sind. Die neuen Rechnerdaten werden durch den Eingabeparameter rechner übergeben. Der zweite Parameter gibt an, welche Daten aus rechner in die Rechnerliste eingetragen werden sollen. Dieser Parameter kann drei unterschiedliche Werte besitzen, die den jeweiligen Typ des ersten Parameters angeben (vgl. Tabelle D-1). Typ 2 3 4 Bedeutung Rechner über Ping erreichbar. In der _rechner-Struktur sind nur die Felder IP-Adresse und Hostname gültig. Auf Rechner läuft Applikation. Alle Felder der _rechner-Struktur sind gültig. Benchmark. Nur die Felder Bandbreite und Messungen sind gültig. Tabelle D-1: Typen 81 Anhang D Funktionsbeschreibung Eigenes_Icon_ueberpruefen() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion ermittelt die Darstellung des eigenen Rechner-Symbols in der Rechnerliste. Das Symbol wird aus dem Status des Bildschirmschoners und der aktuellen CPU-Auslastung bestimmt. Feld_anzeigen() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Hier wird die Ausgabe der Rechnerliste im Hauptdialogfeld gesteuert. Dazu wird zuerst bestimmt welche Rechner-Typen überhaupt für den Benutzer sichtbar sein sollen. Danach wird die Rechnerliste durchlaufen und für jeden Rechner überprüft, ob er neu dargestellt werden muß. Falls sich die Ansicht eines Rechners geändert hat, so ist in seinem Datensatz das changed-Flag gesetzt. Hat sich die Ansicht der ganzen Rechnerliste geändert, so ist das Member-Flag m_ViewChanged gesetzt und die gesamte Rechnerliste wird neu dargestellt. Nachdem das Dialogfeld aktualisiert worden ist, werden alle gesetzten Flags wieder auf FALSE gesetzt. Konv_IP() Eingabeparameter: CString ip Rückgabeparameter: CString Beschreibung: Diese Funktion ändert die Darstellung von IP-Adressen. Dazu werden alle vier Abschnitte der Adresse mit 0-en aufgefüllt. Der Eingabeparameter beinhaltet die originale Adresse. Der Ausgabewert hat nach der Konvertierung eine Länge von 15 Zeichen. Dadurch können IP-Adressen, die in CStrings gespeichert worden sind, verglichen und sortiert werden. Bei einer unterschiedlichen Länge der CStrings wäre eine Sortierung nicht möglich. 82 Anhang D Funktionsbeschreibung KonvBand() Eingabeparameter: Float wert Rückgabeparameter: CString Beschreibung: Die Verbindungsbandbreite wird im Rechnerdatensatz als Float-Wert in Bit/s angegeben. Da die Performance oft bei einigen Mbit/s liegt, ist sie für den Benutzer schlecht zu lesen. Zusätzlich negativ wirkt sich aus, daß die Anzahl der Nachkommastellen variiert. Diese Funktion formatiert die Verbindungsbandbreite, indem die Einheiten kbit/s, Mbit/s und Gbit/s verwendet werden. Außerdem werden die Nachkommastellen auf zwei begrenzt. Der Wert wird dann als CString inklusive der verwendeten Einheit ausgegeben. KonvBytes() Eingabeparameter: CString Rückgabeparameter: CString Beschreibung: Die Systemdaten, die eine Speichergröße beschreiben, wie z.B. freier physikalischer Hauptspeicher, verwenden die Einheit Byte. Da die erfaßten Daten jedoch Speichergrößen im MByte- oder GByte-Bereich besitzen, sind diese Werte für den Benutzer schlecht überschaubar. Deshalb formatiert diese Funktion die Speichergröße mit einer passenden Einheit, wobei die Anzahl der Nachkommastellen auf zwei begrenzt wird. LocalDisk() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion bestimmt die Größe und den freien Speicherplatz der Festplattenpartition, von der die Applikation gestartet worden ist. 83 Anhang D Funktionsbeschreibung LocalIPAdress() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Hier wird die lokale IP-Adresse bestimmt. Falls kein Netzwerk vorhanden ist, wird die Loopback-Adresse 127.0.0.1 angegeben. LocalMACAdress() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Die Funktion bestimmt die lokale MAC-Adresse. Falls keine Netzwerkkarte vorhanden ist, wird die Adresse 00:00:00:00:00 angegeben LocalMachine() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Es wird der lokale Computernamen bestimmt. Dabei wird nicht der Name vom DNS-Server abgefragt, sondern der Eintrag in den lokalen Netzwerkeinstellungen verwendet. LocalMemory() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion ermittelt die lokalen physikalischen und virtuellen Hauptspeicherwerte. 84 Anhang D Funktionsbeschreibung LocalOS() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Hier wird der Typ und die Versionsnummer des Betriebssystems bestimmt. LocalProcessor() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Der Hersteller, der Typ und die Taktfrequenz des lokalen Prozessors wird bestimmt. Dabei wird auf die Angaben zurückgegriffen, die von der CPU und vom BIOS über das Betriebssystem geliefert werden. LocalUser() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion liefert den Namen des Benutzers, der am lokalen Rechner angemeldet ist. NetzwerkAktiv() Eingabeparameter: void Rückgabeparameter: BOOL Beschreibung: Es wird ermittelt, ob ein Netzwerk vorhanden ist. Die Funktion liefert den Wert TRUE zurück, falls ein Netzwerk vorhanden ist, andernfalls wird FALSE zurückgegeben. 85 Anhang D Funktionsbeschreibung OnAccept() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Die Funktion akzeptiert eine Verbindung auf dem Server-Socket. OnClose() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Hier wird eine bestehende Verbindung auf dem Server-Socket geschlossen. OnConnect() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Es wird eine Verbindung auf dem Server-Socket geöffnet und nach einem erfolgreichen Verbindungsaufbau die Funktion OnSend aufgerufen. OnDetails() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion erstellt das Details-Dialogfeld für den markierten Rechner. Vorher werden die Systemdaten des Rechners in das Dialogfeld übernommen. OnInitDialog() Eingabeparameter: void 86 Anhang D Funktionsbeschreibung Rückgabeparameter: void Beschreibung: Diese Funktion wird zu Beginn des Programmes aufgerufen, noch bevor der Hauptdialog erstellt wird. Es wird zuerst überprüft, ob ein Netzwerk vorhanden ist und ob die Applikation schon auf dem lokalen Rechner läuft. Danach werden die Programmparameter aus der Konfigurationsdatei geladen, die eigenen Systemdaten bestimmt und die eventuell vorhandene Ausgabedatei geladen. Letztlich werden die Timer und die nebenläufigen Threads gestartet. OnOptions() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion erstellt ein modales Optionen-Dialogfeld. Vorher werden die aktuellen Programmparameter in die Eingabefelder des Optionen-Dialogs kopiert. Nach dem Schließen des Dialogs werden die Änderungen übernommen. Falls notwendig, werden die Timer neu gestartet, weil sich die Intervallzeiten geändert haben. OnReceive() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Es werden Daten aus dem Empfangspuffer gelesen. Das empfangene Paket wird in Protokollkopf und Nutzdaten zerlegt. Am Protokollkopf ist ersichtlich, ob das empfangene Paket von der Applikation Systemdetector abgesendet worden ist. Falls der Protokollkopf ungültig ist, wird das Paket verworfen. Handelt es sich um ein Datenpaket, so werden jetzt die Daten unter Verwendung der Funktionen Daten_aktualisieren und Rechner_hinzufuegen in die Rechnerliste eingetragen. Falls ein Benchmark-Paket eintrifft, wird die Verbindungsbandbreite bestimmt. Die bestehende Verbindung zu dem Rechner wird danach geschlossen. 87 Anhang D Funktionsbeschreibung OnSend() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Diese Funktion wird aufgerufen, wenn vom Server-Socket Daten gesendet werden. OnClose() Eingabeparameter: void Rückgabeparameter: void Beschreibung: Hiermit wird eine bestehende Verbindung auf dem Server-Socket geschlossen. OnTimer() Eingabeparameter: UINT nIDEvent Rückgabeparameter: void Beschreibung: Die Funktion wird aufgerufen, wenn ein Timer-Event ausgelöst worden ist. Mit dem Eingabeparameter nIDEvent wird die Nummer des Timer-Ereignisses übergeben. Die an dieses Ereignis gekoppelten Anweisungen werden daraufhin ausgeführt. In dieser Funktion werden alle zeitgesteuerten Funktionen, wie z.B. die Feldanzeige und der Scanner, behandelt. PingHost() Eingabeparameter: unsigned long ulIP int iPingTimeout Rückgabeparameter: DWORD Beschreibung: Die Aufgabe dieser Funktion besteht darin, eine Ping-Anfrage an einen entfernten Host zu senden, um festgestellt, ob der Host konnektierbar ist. Mit den 88 Anhang D Funktionsbeschreibung Eingabeparametern wird die IP-Adresse und der Timeout-Wert mitgeteilt. Als Funktionsergebnis wird die Antwortzeit des Hosts angegeben. Falls der Rechner nicht antwortet, so wird ein Ausgabewert zurückgeliefert, der größer ist als der Timeout-Wert, woraus die aufrufenden Funktionen erkennen, daß ein Rechner nicht erreichbar ist. Rechner_anzeigen() Eingabeparameter: _rechner* rechner Rückgabeparameter: void Beschreibung: Diese Funktion trägt einen Rechner in das Listenfeld im Hauptdialog ein. Dabei wird die IP-Adresse in die erste, der Hostname in die zweite und der Benutzername in die dritte Spalte eingetragen. Rechner_hinzufuegen() Eingabeparameter: _rechner rechner_daten int typ Rückgabeparameter: void Beschreibung: Diese Funktion fügt dem Rechnerfeld einen neuen Rechner mit seinen Systemdaten hinzu. Der erste Eingabeparameter beinhaltet die Daten des Rechners, der zweite Parameter gibt an, welche Felder im ersten Parameter gültig sind. Dazu werden vier unterschiedliche Typen verwendet (vgl. Tabelle D-2). Typ 1 2 3 4 Bedeutung Rechnerdaten kommen aus der CSV-Datei. Es werden nur die Felder IP-Adresse und letztes Lebenszeichen übernommen. Rechner über Ping erreichbar. In der _rechner-Struktur sind nur die Felder IP-Adresse und Hostname gültig. Auf Rechner läuft Applikation. Alle Felder der _rechner-Struktur sind gültig. Benchmark. Nur die Felder Bandbreite und Messungen sind gültig. Tabelle D-2: Typen 89 Anhang D Funktionsbeschreibung Rechner_suchen() Eingabeparameter: CString ip Rückgabeparameter: _rechner Beschreibung: Die Aufgabe dieser Funktion ist es, einen Rechner in der Rechnerliste zu suchen. Als Suchkriterium dient die IP-Adresse als Eingabeparameter. Als Ausgabe wird der komplette Datensatz des Rechners geliefert. Screensaver_abfragen() Eingabeparameter: void Rückgabeparameter: CString Beschreibung: Diese Funktion ermittelt den Namen des Bildschirmschoners, der für den lokalen Rechner für den angemeldeten Benutzer momentan eingestellt ist. Der Name wird als Rückgabeparameter zurückgeliefert. Falls keine Bildschirmschoner eingetragen ist, wird ein leerer String übergeben. SD_running() Eingabeparameter: void Rückgabeparameter: BOOL Beschreibung: Hier wird ermittelt, ob bereits ein anderer Prozeß mit dem Namen Systemdetector läuft. Die Funktion liefert den Wert TRUE zurück, falls ein gleicher Prozeß gefunden worden ist, andernfalls FALSE. SortTextItems() Eingabeparameter: int nCol BOOL bAscending int low int high 90 Anhang D Funktionsbeschreibung Rückgabeparameter: BOOL Beschreibung: Diese Funktion sortiert das Rechnerlistenfeld im Hauptdialog. Dazu wird im ersten Eingabeparameter die Spalte, nach der sortiert werden soll, angegeben. Der zweite Parameter gibt an, ob auf- oder absteigend sortiert werden soll. Der Wert TRUE bedeutet aufsteigende Sortierung. Mit den letzten beiden Parametern wird die untere und obere Grenze der Indizes der Elemente angegeben, die sortiert werden sollen. Der Rückgabeparameter gibt mit TRUE eine erfolgreiche Sortierung an. Falls eine Sortierung mit den angegebenen Parametern nicht möglich ist, wird FALSE zurückgeliefert. 91 Anhang E Member-Objekte und Objekt-IDs Anhang E Member-Objekte und Objekt-IDs Bedienelement Objekt-ID / Nachricht CAboutDlg Dialogfeld IDD_ABOUTBOX Member-Funktion / Member-Variable DoDataExchange Text Bitmap Text Version 1.0 Button OK CDetailsDialog Dialogfeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Gruppenfeld Gruppenfeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld IDC_STATIC IDC_SYMBOL IDC_VERSION IDOK IDD_DETAILS IDC_ANZAHL_PROZESSOREN IDC_BANDWIDTH IDC_BENUTZERNAME IDC_DOMAIN IDC_FRAME1 IDC_FRAME2 IDC_IPADRESSE IDC_MACADRESSE IDC_NETZWERK IDC_OS IDC_P_LAST IDC_PLATTENPLATZ IDC_PLATTENPLATZ_FREI IDC_PROZESSOR_HERSTELLER IDC_PROZESSOR_SPEED IDC_PROZESSOR_TYP IDC_RAM IDC_RAM_FREI IDC_RAM_VIRT IDC_RAM_VIRT_FREI IDC_RECHNERNAME IDC_SAVER DoDataExchange m_anzahl_prozessoren m_bandwidth m_benutzer_name m_domain m_ip_adresse m_mac_adresse m_netzwerk m_os m_p_last m_plattenplatz m_plattenplatz_frei m_prozessor_hersteller m_prozessor_speed m_prozessor_typ m_ram m_ram_frei m_ram_virt m_ram_virt_frei m_rechner_name m_saver 92 Anhang E Member-Objekte und Objekt-IDs Bedienelement Objekt-ID / Nachricht Text Eingabefeld Eingabefeld Button Schließen COptionsDialog Dialogfeld IDC_STATIC IDC_SUBNETZMASKE IDC_TIME IDCANCEL Eingabefeld Eingabefeld Eingabefeld Eingabefeld Eingabefeld Button History löschen Eingabefeld Eingabefeld Eingabefeld Eingabefeld Button Scanner starten SpinButton SpinButton SpinButton SpinButton SpinButton SpinButton SpinButton SpinButton Text Member-Funktion / Member-Variable m_subnetzmaske m_time IDD_OPTIONS IDC_BENCHMARK EN_CHANGE IDC_CPU IDC_DATENAUSTAUSCH EN_CHANGE IDC_FELDANZEIGE EN_CHANGE IDC_FILE IDC_HISTORY DoDataExchange OnInitDialog m_Benchmark OnChangeBenchmark m_CPU m_Datenaustausch OnChangeDatenaustasch m_Feldanzeige OnChangeFeldanzeige m_File OnHistory IDC_INFO IDC_LEBENSZEICHEN IDC_PING IDC_SCANNER EN_CHANGE IDC_SCANNER_BUTTON m_Info m_Lebenszeichen m_Ping m_Scanner OnChangeScanner OnScannerButton IDC_SPIN1 IDC_SPIN2 IDC_SPIN3 IDC_SPIN4 IDC_SPIN5 IDC_SPIN6 IDC_SPIN7 IDC_SPIN8 IDC_STATIC m_Datenaustausch_Ctrl m_Scanner_Ctrl m_CPU_Ctrl m_Systemdaten_Ctrl m_Ping_Ctrl m_Feld_Ctrl m_lebenszeichen_Ctrl m_Benchmark_Ctrl 93 Anhang E Member-Objekte und Objekt-IDs Bedienelement Objekt-ID / Nachricht Button IDCANCEL Abbrechen Button IDOK OK CSystemdetectorDlg Dialogfeld IDD_SYSTEMDETECTOR_DIALOG Radiobutton Listenfeld Progressbar CPUAuslastung Button Details Button Beenden Button Optionen Radiobutton WM_INIT_DIALOG WM_PAINT WM_QUERYDRAGICON WM_SYSCOMMAND WM_TIMER IDC_ALIVE IDC_CLUSTER LVN_COLUMNCLICK NM_DBLCLK IDC_CPU Member-Funktion / Member-Variable OnOK DoDataExchange OnInitDialog OnPaint OnTimer OnAlive m_Cluster OnColumnClickCluster OnDblclkCluster IDC_DETAILS OnDetails IDC_EXIT_BUTTON OnExitButton IDC_OPTIONS OnOptions IDC_PING OnAlive Tabelle E-1: Member-Objekte und Objekt-IDs der Dialogfelder 94 Anhang F Schnittstellen der Klassen Anhang F Schnittstellen der Klassen Zwischen den wichtigsten Klassen CSystemdetectorDlg, CDynamicDataThread, COptionsdialog, CScannerThread, CServerSocket und CSysInfoThread sind Schnittstellen in bezug auf die aufzurufenden Funktionen und Variablen definiert worden. Diese sind folgend tabellarisch aufgeschlüsselt. Zeiger von CDynamicDataThread auf CSystemdetectorDlg: m_pOwner→ Funktion LocalMemory LocalDisk Variablen m_Disk_free m_erster_rechner m_AvailPhysMemory m_AvailVirtualMemory m_TotalVirtualMemory Tabelle F-1: Zugriff von CDynamicDataThread auf CSystemdetectorDlg Zeiger von COptionsDialog auf CSystemdetectorDlg: m_pWnd→ Funktion SuspendScanner m_erster_rechner m_Cluster Variablen m_Benchmarkintervall m_Ping m_Filename m_CPUintervall m_Datenaustauschintervall m_Lebensintervall m_Scannerintervall m_Infointervall m_Feldanzeigeintervall Tabelle F-2: Zugriff von COptionsDialog auf CSystemdetectorDlg Zeiger von CScannerThread auf CSystemdetectorDlg: m_pOwner→ Funktion ResolveIP Konv_IP PingHost Variablen m_host m_IpAdresse Tabelle F-3: Zugriff von CScannerThread auf CSystemdetectorDlg 95 Anhang F Schnittstellen der Klassen Zeiger von CServerSocket auf CsystemdetectorDlg: m_pWnd→ Funktion OnAccept OnConnect OnClose OnReceive OnSend Tabelle F-4: Zugriff von CServerSocket auf CSystemdetectorDlg Zeiger von CSysInfoThread auf CsystemdetectorDlg: m_pOwner→ Variablen m_CPU m_erster_rechner m_Scanner_aktiv m_CPUintervall Tabelle F-5: Zugriff von CSysInfoThread auf CSystemdetectorDlg 96 Anhang G Programmstrukturen Anhang G Programmstrukturen G-I Klasse CDynamicDataThread Endlosschleife Intervall abwarten LocalDisk LocalMemory Neue Daten eintragen Abbildung G-1:GetData G-II Klasse COptionsDialog Sicherheitsabfrage Abfrage mit OK beantwortet ? Nein Ja Rechnerliste löschen Listenfeld im Hauptdialog löschen % Ausgabedatei löschen Abbildung G-2: OnHistory Scanner aktiv ? Nein Ja Button Scanner starten deaktivieren % Wertebereiche für Eingabefelder einstellen Werte in Eingabefelder eintragen Abbildung G-3: OnInitDialog 97 Anhang G Programmstrukturen Neue Werte OK ? Ja Nein Neue Werte aus den Eingabefeldern übernehmen Einstellungen in Konfigurationsdatei speichern Fehler ausgeben Dailogfeld schließen Abbildung G-4: OnOK G-III Klasse CScannerThread PingHost Antwortzeit<Timeout ? Nein Ja Ping-Flag setzen Verbindung auf Port 9001 aufbauen Verbindung erfolgreich ? Ja Nein Verbindung schließen ApplikationsFlag setzen Ping- und ApplikationsFlag löschen Applikations-Flag löschen Abbildung G-5: Rechner_abfragen 98 Anhang G Programmstrukturen G-IV Klasse CSysInfoThread Endlosschleife CPU-Last, Scanner-Status und Bildschirmschoner-Status abfragen CPU-Last abspeichern CPU-Last im Hauptdialog anzeigen Scanner-Status abspeichern Bildschirmschoner-Status abspeichern Intervall abwarten Abbildung G-6: GetSysInfo G-V Klasse CSystemdetectorDlg Aktuelle Systemzeit bestimmen Schleife über alle Rechner Lebenszeichen zu alt? Ja Nein Symbol ändern % Abbildung G-7: Cluster_ueberpruefen Schleife über alle Rechner Erreichbar und Applikation? Nein Ja Benchmark gelaufen? Ja Typ 1 senden Nein Typ 2 senden Nur erreichbar? Ja Rechner mit grauem Symbol eintragen Nein % Abbildung G-8: Connect_to_host 99 Anhang G Programmstrukturen Ausgabedatei erstellen Zeile mit Überschriften abspeichern Schleife über alle Rechner Systemdaten abspeichern Neue Zeile Abbildung G-9: CSV_Datei Ausgabedatei öffnen Zeile mit Überschriften überspringen Schleife über alle Zeilen Neuen Rechner erstellen IP-Adresse und letztes Lebenszeichen abspeichern Abbildung G-10: CSV_Datei_laden Rechner in Rechnerliste suchen Fallunterscheidung Typ 3 2 Ändere Symbol auf grau Altes Symbol farbig? Ja N Lösche Systemdaten Bestimme Hostnamen Bestimme farbiges Symbol Trage % Systemdaten ein 4 default Trage Bandbreite ein % Abbildung G-11: Daten_aktualisieren 100 Anhang G Programmstrukturen Bildschirmschoner aktiv? Ja Nein Fallunterscheidung CPU-Last Fallunterscheidung CPU-Last 33%<Last Last<=33% <=66% Last>=67% default Gelbes Symbol % Grünes Symbol Rotes Symbol 33%<Last Last<=33% <=66% Last>=67% Grünes Z Gelbes Z Rotes Z default % Hat sich Symbol geändert? Ja Nein % Rechner neu zeichnen Abbildung G-12: Eigenes_Icon_ueberpruefen Schleife über alle Rechner Hat sich Rechneransicht geändert ? Ja Fallunterscheidung Symbol Farbig Rechner neu zeichnen Grau Durchgestrichen Typ anzeigen? Ja Rechner neu zeichnen default Typ anzeigen? N Ja Rechner % neu zeichnen Nein % N % % Abbildung G-13: Feld_anzeigen Ist genau ein Rechner markiert? Ja Nein Bestimme markierten Rechner Kopiere Systemdaten ins Details-Dialogfeld % Erzeuge modalen Details-Dialog Abbildung G-14: OnDetails 101 Anhang G Programmstrukturen Rufe Bestätigungs-Dialog auf Ist Beenden bestätigt worden? Nein Ja Server-Socket schließen % Programm beenden Abbildung G-15: OnExitButton Daten-Strukturen initialisieren Läuft die Applikation bereits? Nein Ja Ist ein Netzwerk vorhanden? Nein Ja % Eigene IP-Adresse auf Loopback setzen Konfigurationsdatei auslesen Lokale Systemdaten abfragen Programm beenden Eigene Daten in Rechnerfeld eintragen Existiert eine alte CSV-Datei ? Ja Nein CSV Datei laden % Nebenläufige Threads starten Timer starten Eigene IP-Adresse=Loopback ? Ja Nein Scanner starten % Abbildung G-16: OnInitDialog 102 Anhang G Programmstrukturen Programmeinstellungen in Optionen-Dialog kopieren Optionen-Dialog als modales Fenster starten Haben sich Intervalle geändert? Ja Nein % Timer beenden und neu starten Abbildung G-17: OnOptions Daten aus Empfangspuffer abholen Paket in Protokollkopf und Nutzdaten zerlegen Fallunterscheidung Protokollkopf Typ 2 Letztes Paket? Typ 1 Verbindung schließen Rechner schon im Rechnerfeld ? Ja Ja Nein Bandbreite bestimmen Nein Verbindung schließen Verbindung schließen Daten_aktualisieren Sonstiges Rechner_hinzufuegen Daten_aktualisieren % Werte neu initialisieren Abbildung G-18: OnReceive Fallunterscheidung Timer-Event 2 1 Connect_to_hosts Cluster_ueberpruefen Eigenes_Icon_ueberpruefen 3 4 default Feld_anzeigen Reinitialize_Benchmark % Netzwerk? Ja N SuspendScanner % Abbildung G-19: OnTimer 103 Anhang G Programmstrukturen Neue Rechnerstruktur am Ende der Rechnerliste einfügen Fallunterscheidung Typ 1 2 IP-Adresse eintragen IP-Adresse eintragen Lebenszeichen eintragen Hostnamen eintragen Programmsymbol eintragen 3 4 Alle Systemdaten eintragen Bandbreite eintragen default Systemzeit und Systemzeit und Lebenszeichen Lebenszeichen Systemzeit und eintragen eintragen Lebenszeichen Graues Symbol Farbiges Symbol eintragen eintragen eintragen CSV-Datei speichern CSV-Datei speichern % CSV-Datei speichern Abbildung G-20: Rechner_hinzufuegen 104