-
Die
vorliegende Erfindung bezieht sich auf Computersysteme, die mit
anderen Computersystemen kommunizieren und insbesondere auf Verfahren und
Vorrichtungen zum parallelen Einrichten und Verwalten von Verbindungen
zwischen einem Client-System (Anforderungssystem) und ausgewählten Server-Systemen
(Bereitstellungssystemen).
-
Die
meisten Computersysteme besitzen die Fähigkeit, durch ein Computernetzwerk
mit einem anderen Computersystem zu kommunizieren. Häufig kommuniziert
ein Client-System (oder ein Client) mit einem Server-System (oder
einem Server) durch das Einrichten einer sog. Verbindung zwischen
dem Client und dem Server. Eine Verbindung ist ein Mechanismus,
der die Übertragung
von Daten zwischen zwei Endpunkten, einem Endpunkt bei dem Client und
einen bei dem Server, ermöglicht. "The Design and Implementation
of the 4.3BSD UNIX Operating System" von Leffler (1989) liefert detaillierte
Erklärungen
darüber,
wie eine Verbindung zwischen einem Client und einem Server hergestellt
und verwendet wird.
-
Sowohl
der Client als auch der Server führen ein
spezialisiertes Programm durch, um die Verbindung einzurichten und
zu verwalten. Diese spezialisierten Programme erfordern typischerweise
die Verwendung mehrerer komplexer Routinen. Beispielsweise verwenden
UNIX-Programmierer Routinen, wie z.B. socket(), connect() und select(),
um den Client vorzubereiten, die Verbindung zu initiieren und den
Status der Verbindung zu überwachen.
Ein Nachteil besteht darin, daß der
Programmierer dadurch belastet ist, daß er mehr als eine Routine
verwenden muß,
um die Verbindungsvorrichtung einzurichten und zu verwalten, wenn
er ein Programm für den Client
schreibt.
-
Trotzdem
ist eine Verbindung eine nützliche Vorrichtung
für eine
Kommunikation zwischen einem Client und einem Server. Wenn beispielsweise
eine elektronische Nachricht von einem Client zu einem Server gesendet
wird, richtet (1) der Client eine Verbindung zu dem Server ein,
teilt (2) dem Server mit, einen Brief durch die Verbindung zu erwarten,
sendet (3) den Brief durch die Verbindung zu dem Server, und empfängt (4)
eine Rückbestätigung von
dem Server, daß der
Brief durch die Verbindung empfangen wurde.
-
UNIX
verwendet eine Routine, die rcmd() genannt wird, die das Problem
des Durchführens
eines Fernbefehls durch die Verwendung einer Verbindung löst. Ein
Programmierer verwendet die Routine rcmd() in dem Aufrufprogramm,
um einen Befehl aus der Ferne auf einem Server durchzuführen. Die
Routine rcmd() sendet den Fernbefehl durch die Verbindung zu dem
Server. Danach wartet (oder blockiert) die Routine rcmd(), bis die
Routine rcmd() eine Antwort von dem Server erfaßt. Die Routine rcmd() handhabt
automatisch die Verbindungseinrichtung, so daß der Programmierer nicht damit
belastet ist, Routinen, beispielsweise socket(), bind() und connect()
direkt verwenden zu müssen.
Nachdem die Routine rcmd() die Verbindung eingerichtet hat, kann es
notwendig sein, daß das
Aufrufprogramm select() aufrufen muß, um die Konversation zu verwalten, d.h.,
um die Daten, die von dem Server empfangen werden, zu verwalten.
-
Der
Server verwendet einen Dämon
inedt (inetd daemon), um auf die Routine rcmd() des Clients zu antworten.
Ein Dämon
ist ein Prozeß,
der einen System-bezogenen Dienst liefert, wobei der System-bezogene
Dienst in diesem Fall die Antwort des Servers auf die Routine rcmd()
ist, was zur Folge hat, daß der
Server eine Anzeige zu dem Client zurücksendet, daß der Befehl
ausgeführt
wurde. Speziell startet der Dämon
inetd einen Dämon
remshd, welcher gemäß einem
eingerichteten Protokoll (welches hierin der Einfachheit halber
das remsh- Protokoll
genannt wird) den Fernbefehl von dem Client empfängt, den Fernbefehl ausführt und
ein Null-Byte zu dem Client zurückgibt.
-
Jedoch
weist die Routine rcmd() mehrere Nachteile auf. Erstens muß das Aufrufprogramm,
sobald das Aufrufprogramm die Routine rcmd() aufruft, warten, bis
die Routine rcmd() die gesamte Fernbefehl-Aufrufoperation abgeschlossen
hat. D.h., daß die
Routine rcmd() als ein atomischer (d.h. nichtteilbarer) Schritt
des (1) Einrichtens einer Verbindung mit dem Server, (2) Sendens
des Fernbefehls zu dem Server, (3) Blockierens (d.h. Wartens), um
zu ermöglichen,
daß der
Server antwortet, und (4) Empfangens eines Null-Bytes von dem Server
wirksam ist. Die Atomarität
der Routine rcmd() kann eine Unannehmlichkeit für das Aufrufprogramm darstellen.
Insbesondere ist die Ansprechzeit des Aufrufprogramms dadurch erhöht, daß es warten
muß, bis
die Routine rcmd() abgeschlossen ist.
-
Zweitens
führt die
Routine rcmd() "Wiederholungs"-Operationen durch,
bis die Routine rcmd() das Null-Byte empfängt, oder bis eine feste Anzahl von
Wiederholungen durchgeführt
ist (d.h. eine Zeitablaufbedingung auftritt). Insbesondere wenn
der Server nicht verfügbar
ist, wird die Routine rcmd() trotzdem insgesamt fünfmal versuchen,
(1) eine Verbindung einzurichten, (2) den Fernbefehl zu senden, und
(3) zu warten, um eine Antwort zu empfangen, bevor eine Fehleranzeige
geliefert wird. Dieser Betrieb blockiert das Aufrufprogramm für etwa 30
Sekunden. Folglich macht die Verwendung der Routine rcmd() das Verhalten
des Aufrufprogramms sehr empfindlich gegenüber Verbindungsproblemen.
-
Drittens
erzeugt die Routine rcmd() jedesmal eine neue Verbindung, wenn sie
aufgerufen wird. Folglich werden jedesmal, wenn das Aufrufprogramm
die Routine rcmd() aufruft, um einen Fernbefehl auf einem speziellen
Client auszuführen,
Betriebsmittel sowohl durch den Client als auch durch den Server
verbraucht, um eine neue Verbindung zu erzeugen und bei zubehalten.
-
Außerdem unterstützt die
Routine rcmd() keine Parallelisierung der Kommunikation, d.h., daß ein Programmierer
die Routine rcmd() nicht verwenden kann, um Verbindungen zu mehr
als einem Server einzurichten und den Fernbefehl gleichzeitig zu jedem
Server zu senden. Wenn der Programmierer wünscht, einen Fernbefehl auf
mehr als einem Server auszuführen,
muß der
Programmierer folglich die Routine rcmd() wieder und wieder für jeden
Server seriell aufrufen oder zu einem neuen Prozeß verzweigen,
um mit jedem Server zu kommunizieren, was Betriebsmittel-aufwendig
ist. Es sollte offensichtlich sein, daß mehrere Zeitabläufe von
30 Sekunden, die beispielsweise durch Netzwerkprobleme bewirkt werden,
die Probleme eines schlecht arbeitenden Aufrufprogramms verschlimmern
können.
-
Wenn
der Programmierer wünscht,
Verbindungen mit mehreren Servern gleichzeitig unter Verwendung
der Verbindungsroutinen, beispielsweise connect() und select(),
direkt einzurichten und zu verwalten, sind dem Programmierer andererseits
dadurch Unannehmlichkeiten bereitet, daß er zusätzliche Zeit und Bemühungen in
das Entwickeln eines Codes investieren muß, der die Einrichtung und
die Verwaltung einer Verbindung zwischen dem Client und jedem Server
koordiniert und unterscheidet.
-
Folglich
existiert ein Bedarf nach einem Werkzeug, das es einem Programmierer
ermöglicht, bequem
und wirksam Verbindungen zwischen einem Client und mehr als einem
Server parallel einzurichten und zu verwalten. Außerdem existiert
ein Bedarf nach einer Vorrichtung, die es einem Client ermöglicht,
Fernbefehle auf einem Server auszuführen, welche die Nachteile
der Routine rcmd(), die oben dargelegt wurde, überwindet.
-
Die
EP 0467546 A2 betrifft
ein verteiltes Datenverarbeitungssystem, bei dem eine Mehrzahl von Datenverarbeitungsknoten
mittels eines Netzwerks verbunden sind. Bei den Knoten handelt es
sich z. B. um Personalcomputer, Workstations oder Großrechner
und das Netzwerk kann beispielsweise ein lokales Netzwerk sein.
Jeder Knoten enthält
eine Anzahl von Anwendungsprogrammen, sogenannte Agenten, bei denen
ein Problem existiert, wenn ein Knoten fehlerhaft funktioniert.
In diesem Fall sind alle Server-Agenten an diesem Knoten für das Gesamtsystem
nicht mehr verfügbar
und das Gesamtsystem kann daher nicht mehr betrieben werden. Diese
Problematik wird dadurch gelöst,
dass zumindest einige der Server-Agenten vervielfacht werden, um
so eine Mehrzahl von Kopien des selben Dienstes zu schaffen.
-
Die
WO 95/00905 A1 betrifft einen Programm-zu-Programm-Kommunikationsserver,
der dazu dient, eine Schnittstelle zwischen Programmen in einer
ersten Computerumgebung mit Programmen in einer zweiten Computerumgebung
zu schaffen. Ein Server ist vorgesehen, welcher einen Datenaustausch
zwischen den Programmen, die auf unterschiedlichen Client-Computern laufen,
mit Programmen, die in einer anderen Computerumgebung ablaufen,
ermöglicht.
Dieser Server schafft eine Serverbeziehung mit einer Vielzahl von
Client-Computern und
bildet einen einzelnen Steuerungspunkt für die Kommunikation mit einem
oder mehreren Computern in einer anderen Umgebung. Durch den Server
werden mehrere Serverprozesse erzeugt, die durch die Programme in
einer ersten Computerumgebung verwendet werden, um mit Programmen
in einer zweiten Computerumgebung zu kommunizieren.
-
Die
US-A-5,355,453 betrifft eine Architektur für einen parallelen Eingabe/Ausgabe-Netzwerkdateiserver.
Diese Serverarchitektur umfasst eine Mehrzahl von Netzwerksteuerungen,
von Datensteuerungen und von Speicherprozessoren, die alle über einen
Meldungsbus verbunden sind und parallel zu dem Hauptrechner laufen.
Die Steuerungen sind wirksam, um nur diejenigen Datenpakete, welche nicht
durch die Netzwerksteuerungen verarbeitet werden können, an
den Hauptrechner zur Verarbeitung weiterzuleiten.
-
Die
US-A-4,982,187 betrifft eine Architektur für ein Umschalt-Teilsystem,
das eine Verbindung einer Mehrzahl von Anforderungen pro Verbindungseinrichtung
ermöglicht.
Das Schalt-Teilsystem arbeitet als ein Kreuzschienenschalter unter
der Steuerung einer Steuerungseinrichtung, um ausgewählte Eingangsverbindungen
mit ausgewählten
Ausgangsverbindungen zu verbinden. Eine Datenstruktur ist vorgesehen,
zusammen mit drei Schaltservern, einem Anfrageserver und einem Verbindungsserver sowie
einem Bestätigungsserver.
Ein Schnittstellenprotokoll kann für verschiedene Anwendungen
angepasst sein und ermöglicht
es Anfragen entweder in einer Warteschlange zwischenzuspeichern
bis eine angeforderte Verbindung verfügbar ist oder den Anfragenden
sofort zu informieren, dass eine angeforderte Verbindung nicht möglich ist.
-
Die
Aufgabe der vorliegenden Erfindung besteht darin, ein Verfahren
und eine Vorrichtung zu schaffen, um wirksam eine Verbindung zwischen
einem Client-Computersystem und einer Mehrzahl von Server-Computersystemen
parallel einzurichten und zu verwalten.
-
Diese
Aufgabe wird durch ein Verfahren gemäß Patentanspruch 1 und durch
eine Vorrichtung gemäß Patentanspruch
13 gelöst.
-
Ein
erster Aspekt der Erfindung richtet sich auf ein Verfahren zum Einrichten
und Verwalten einer Verbindung zwischen einem Client-Computersystem und
jedem einer Mehrzahl von Server-Computersystemen. Das Verfahren
weist folgende Schritte auf: (a) Bereitstellen einer Mehrzahl von
Serversystem-Datenstrukturen, wobei jede der Mehrzahl von Serversystem-Datenstrukturen
einem der Mehrzahl von Server-Computersystemen
zugeordnet ist und einen Statusanzeiger aufweist, der einen Wert
speichert, welcher einen Verbindungszustand anzeigt, der zwischen
dem Client-Computersystem und dem zugeordneten der Mehrzahl von
Server-Computersystemen existiert; (b) Versuchen, für jede der
Mehrzahl von Serversystem-Datenstrukturen, die einen Statusanzeiger
aufweisen, der einen Wert speichert, der keine Verbindung anzeigt,
eine Verbindung zwischen dem Client-Computersystem und dem zugeordneten der
Mehrzahl von Server-Computersystemen einzurichten; und (c) Versuchen,
für jede
der Mehrzahl von Serversystem-Datenstrukturen, den Verbindungszustand
zwischen dem Client-Computersystem und dem zugeordneten der Mehrzahl
von Server-Computersystemen weiterzustellen, und Aktualisieren des Statusanzeigers,
wenn der Verbindungszustand zwischen dem Client-Computersystem und
dem zugeordneten der Mehrzahl von Server-Computersystemen weitergestellt
ist.
-
Ein
weiterer Aspekt der Erfindung richtet sich auf ein Verfahren zum
Einrichten und Verwalten einer Verbindung zwischen einem Client-Computersystem und
einem Server-Computersystem. Das Verfahren weist folgende Schritte
auf: (a) Bereitstellen einer Serversystem-Datenstruktur, die einen
Statusanzeiger aufweist, welcher einen wert speichert, der einen Verbindungszustand
anzeigt, der zwischen dem Client-Com putersystem und dem Server-Computersystem
existiert; (b) Versuchen, eine Verbindung zwischen dem Client-Computersystem
und dem Server-Computersystem einzurichten, wenn der Statusanzeiger
einen Wert speichert, der keine Verbindung anzeigt; und (c) Versuchen,
den Verbindungszustand zwischen dem Client-Computersystem und dem
Server-Computersystem weiterzustellen, und Aktualisieren des Statusanzeigers,
wenn der Verbindungszustand zwischen dem Client-Computersystem und dem
Server-Computersystem weitergestellt ist.
-
Ein
weiterer Aspekt der Erfindung richtet sich auf eine Vorrichtung
zum Einrichten und Verwalten einer Verbindung mit jedem einer Mehrzahl
von Server-Computersystemen in einem Computernetzwerk. Die Vorrichtung
weist einen elektronischen Digitalcomputer mit einem Prozessor,
einem Speicher und einer Netzwerkschnittstelle auf. Der Computer
wirkt als ein Client-Computersystem. Der Computer weist eine Einrichtung
auf, um eine Mehrzahl von Serversystem-Datenstrukturen zu liefern,
wobei jede der Mehrzahl von Serversystem-Datenstrukturen einem einer
Mehrzahl von Server-Computersystemen zugeordnet ist und einen Statusanzeiger
aufweist, der einen Wert speichert, welcher einen Verbindungszustand
zwischen dem Client-Computersystem und dem zugeordneten der Mehrzahl
von Server-Computersystemen anzeigt. Das Client-Computersystem weist
ferner eine Einrichtung auf, um für jede der Mehrzahl von Serversystem-Datenstrukturen,
die einen Statusanzeiger aufweist, der einen Wert speichert, welcher
keine Verbindung anzeigt, zu versuchen, eine Verbindung zwischen
dem Client-Computersystem und dem zugeordneten der Mehrzahl von Server-Computersystemen
einzurichten. Das Client-Computersystem weist zusätzlich eine
Einrichtung auf, um für
jede der Mehrzahl von Serversystem-Datenstrukturen zu versuchen,
den Verbindungszustand zwischen dem Client-Computersystem und dem
zugeordneten der Mehrzahl von Server-Computersystemen weiterzustellen,
und um den Statusanzeiger zu aktualisieren, wenn der Verbindungszustand
zwischen dem Client-Computersystem und dem zugeordneten der Mehrzahl
von Server-Computersystemen
weitergestellt ist.
-
Ein
weiterer Aspekt der Erfindung ist auf eine Vorrichtung zum Einrichten
und Verwalten einer Verbindung zwischen einem Client-Computersystem und
einem Server-Computersystem in einem Computernetzwerk gerichtet.
Die Vorrichtung weist einen elektronischen Digitalcomputer mit einem
Prozessor, einem Speicher und einer Netzwerkschnittstelle auf. Der
Computer ist als ein Client-Computersystem wirksam. Das Client-Computersystem
weist eine Einrichtung auf, um eine Serversystem-Datenstruktur mit einem Statusanzeiger,
der einen Wert speichert, der einen Verbindungszustand zwischen
dem Client-Computersystem und dem Server-Computersystem anzeigt,
zu liefern. Das Client-Computersystem weist ferner eine Einrichtung
auf, um zu versuchen, eine Verbindung zwischen dem Client-Computersystem
und dem Server-Computersystem einzurichten, wenn der Statusanzeiger
einen Wert speichert, der keine Verbindung anzeigt. Das Client-Computersystem
weist außerdem
eine Einrichtung auf, um zu versuchen, den Verbindungszustand zwischen
dem Client-Computersystem und dem Server-Computersystem weiterzustellen,
und um den Statusanzeiger zu aktualisieren, wenn der Verbindungszustand
zwischen dem Client-Computersystem und dem Server-Computersystem
weitergestellt ist.
-
Bevorzugte
Ausführungsbeispiele
der vorliegenden Erfindung werden nachfolgend bezugnehmend auf die
beiliegenden Zeichnungen näher
erläutert.
Es zeigen:
-
1 ein
Blockdiagramm eines Computersystems, das für die Implementierung der Erfindung geeignet
ist;
-
2 ein
Blockdiagramm eines Computernetzwerks, das für die Implementierung der Erfindung
geeignet ist;
-
3 ein
Diagramm einer Server-Datenstruktur gemäß einem Ausführungsbeispiel
der Erfindung;
-
4 ein
Array von Server-Datenstrukturen gemäß einem Ausführungsbeispiel
der Erfindung;
-
5 ein
Flußdiagramm
einer Routine prcmd() gemäß einem
Ausführungsbeispiel
der Erfindung;
-
6 ein
Flußdiagramm
des Schritts "Schließe bzw.
Beende eine Verbindung" von 5 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
7 ein
Flußdiagramm
des Schritts "Versuche,
eine Verbindung einzurichten" von 5 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
8 ein
Flußdiagramm
des Schritts "Bereite
Client für
Verbindung vor" von
Schritt 7 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
9 ein
Flußdiagramm
des Schritts "Bilde server_identifier
(Server_Identifizierer) auf binäre Form
ab" von 8 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
10 ein
Flußdiagramm
des Schritts "Bereite
Endpunkt vor" von 8 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
11 ein
Flußdiagramm
des Schritts "Versuche,
einen Verbindungszustand weiterzustellen" von 5 gemäß einem
Ausführungsbeispiel
der Erfindung;
-
12 ein
Flußdiagramm
des Schritts "Aktualisiere
eine Auswahlliste" von 11 gemäß einem ersten
Ausführungsbeispiel
der Erfindung;
-
13 ein
Flußdiagramm
des Schritts "Aktualisiere
eine Auswahlliste" von 11 gemäß einem zweiten
Ausführungsbeispiel
der Erfindung;
-
14 eine
Schalterimplementierung des Schritts "Erhalte Auswahlergebnis" von 11 gemäß dem ersten
Ausführungsbeispiel
der Erfindung;
-
15 eine
Schalteranweisungs-Implementierung des Schritts "Erhalte Auswahlergebnis" von 11 gemäß dem zweiten
Ausführungsbeispiel
der Erfindung;
-
16 ein
Flußdiagramm
der connect1_routine() (Verbinde1_Routine) von 14 gemäß dem ersten
Ausführungsbeispiel
der Erfindung;
-
17 ein
Flußdiagramm
der connect1_routine() von 15 gemäß dem zweiten Ausführungsbeispiel
der Erfindung;
-
18 ein
Flußdiagramm
der connect2_routine() von 16 gemäß dem zweiten Ausführungsbeispiel
der Erfindung;
-
19 ein
Flußdiagramm
der connect3_routine() von 15 gemäß dem zweiten Ausführungsbeispiel
der Erfindung;
-
20 ein
Flußdiagramm
der read_wait_routine() (Lesen_Warten_Routine()) von entweder 14 gemäß dem ersten
Ausführungsbeispiel
der Erfindung oder 15 gemäß dem zweiten Ausführungsbeispiel
der Erfindung; und
-
21 ein
Flußdiagramm
der read_ready_routine() (Lesen_Bereit_Routine()) von entweder 14 gemäß dem ersten
Ausführungsbeispiel
der Erfindung oder 15 gemäß dem zweiten Ausführungsbeispiel
der Erfindung.
-
Die
vorliegende Erfindung wird durch die folgende detaillierte Beschreibung,
die in Verbindung mit den beiliegenden Zeichnungen, in denen gleiche Bezugszeichen
gleiche Strukturen anzeigen, gelesen werden sollte, besser verständlich.
Alle Schriften, die hierin genannt sind, sind hiermit ausdrücklich durch Bezugnahme
aufgenommen.
-
Die
Erfindung verwendet einen Computer 1, wie er beispielsweise
in 1 gezeigt ist. Der Computer 1 kann die
Form eines Personalcomputers, eines Lap-Top-Computers, eines Rechner-gestützten Notizbuchs
(notebook), einer Workstation, eines Mainframe-Computers, eines
Supercomputers, eines Mehrprozessor-Computers oder eines verteilten Computernetzwerks
aufweisen, die alle bestimmungsgemäß innerhalb des Bereichs der
Erfindung liegen. Der Computer 1 ist sowohl für ein Client-System
(oder einen Client) als auch ein Server-System (oder einen Server)
repräsentativ.
-
Der
Computer 1 weist einen gewöhnlichen Systembus 2 auf,
der einen Prozessor 3 mit einem Speicher 4 verbindet,
eine Eingabevorrichtung 5, eine Ausgabevorrichtung 6 und
eine Netzwerkschnittstelle 7. Der Speicher 4 weist
sowohl einen primären
Speicher, der eine schnelle Zugriffszeit liefert und typischerweise
in der Form eines Halbleiterspeichers vorliegt, als auch einen sekundären Speicher auf,
der eine langsamere Zugriffszeit liefert und typischerweise in der
Form einer magnetischen Platte oder eines Bands vorliegt, welches
Daten behält, wenn
die Leistung zu dem Computer 1 abgeschaltet ist. Die Eingabevorrichtung 5 ist
vorzugsweise eine Tastatur, kann jedoch auch die Form einer Maus,
eines Scanners, eines Mikrophons, einer Antenne oder einer beliebigen
Kombination derselben aufweisen. Die Ausgabevorrichtung 6 ist
vorzugsweise eine Videoanzeige, kann jedoch auch die Form eines
Druckers, eines Lautsprechers, einer Antenne oder irgendeiner Kombination
derselben annehmen. Ein exemplarischer Computer für die Erfindung
ist der HP9000 Model 710 mit einer Anzeige A1097C, der von Hewlett-Packard
verkauft wird. Obwohl andere Konfigurationen von Computer-Komponenten
betrachtungsgemäß und bestimmungsgemäß innerhalb des
Bereichs der Erfindung liegen, werden weitere Einzelhei ten der Erfindung
zur Vereinfachung der Erklärung
bezüglich
des Computers 1, der in 1 gezeigt
ist, erläutert.
-
Der
Computer 1 weist ein Betriebssystem 10 auf, das
die Zuordnung von Computer-Betriebsmitteln, einschließlich der
Computer-Zeit, des Speicherraums und des Zugriffs auf ein Computernetzwerk, verwaltet.
Außerdem
weist die Erfindung eine prcmd()-Einrichtung 11 auf (die
hierin nachfolgend als die Routine prcmd() bezeichnet wird). Bei
einem ersten Ausführungsbeispiel
richtet die Routine prcmd() 11 eine Verbindung mit einem
kundenspezifischen Dämon
(daemon) auf jedem Server ein und leitet Konversationen zwischen
dem Client und jedem Dämon.
Bei einem zweiten Ausführungsbeispiel enthält die Routine
prcmd() 11 ferner das Protokoll remsh und führt einen
Fernbefehl auf jedem Server durch, mit dem ein Client eine Konversation
führt,
die durch die Routine prcmd() 11 geleitet wird. Vorzugsweise
ist die Routine prcmd() 11 eine Bibliotheksroutine. Jedoch
kann die Routine prcmd() 11 auch die Form eines interaktiven
Benutzerbefehls oder eines Systemaufrufs annehmen, die beide bestimmungsgemäß innerhalb
des Bereichs der Erfindung zu liegen. Sowohl das Betriebssystem 10 als
auch die Routine prcmd() 11 sind in dem Speicher 4 gespeichert.
-
Die
Routine prcmd() 11 ermöglicht
es, daß ein
vernetztes Anwendungsprogramm 12 (d.h. ein Aufrufprogramm)
effizient eine Verbindung zu einer großen Anzahl von Fernsystemen
(d.h. Servern) parallel herstellt. Dies erlaubt es, daß das Aufrufprogramm 12 eine
relativ beliebige Konversation mit jedem der Fernsysteme führt. Bei
dem zweiten Ausführungsbeispiel
implementiert die Routine prcmd() 11 die Client-Seite des Standardprotokolls
remsh, was ermöglicht,
daß die
Routine prcmd() 11 mit den Dämonen inetd und remsh in Wechselwirkung
tritt, die auf den Fernservern laufen. Die Verwendung der Dämonen inetd
und remsh auf den Fernservern mildert die Notwendigkeit für den Benutzer,
einen Dämon zum
Ansprechen auf die Routine prcmd() 11 auf der Server-Seite
zu schreiben. Trotzdem kann der Benutzer wahlweise einen kun denspezifischen
Server-Seiten-Dämon
schreiben, um spezifische Operationen zu handhaben.
-
2 zeigt
ein Blockdiagramm einer geeigneten Umgebung 20 für die Erfindung.
Die Umgebung 20 ist ein Computernetzwerk, das einen Netzwerkbus 21 aufweist,
der den Client 22 mit einem oder mehreren Servern 23 verbindet.
Der Netzwerkbus 21 kann eine beliebige einer Vielzahl von
Topologien und ein beliebiges einer Anzahl von Kommunikationsmedien,
beispielsweise Ethernet, verdrillte Leitungen oder HF-Leitungen,
aufweisen. Der Computer 1 ist eine geeignete Vorrichtung
für den
Client 22. Die Routine prcmd() 11 und das Aufrufprogramm 12 sind
in dem Client 22 befindlich dargestellt. Außerdem ist
der Computer 1 eine geeignete Vorrichtung für jeden
des einen oder der mehreren Server 23. Jeder des einen
oder der mehreren Server 23 muß einen Server-Dämon 24 aufweisen,
der auf Anforderungen von der Routine prcmd() 11 anspricht,
die durch den Netzwerkbus 21 von dem Client 22 empfangen
werden.
-
3 zeigt
eine Server-Struktur 30, die von der Routine prcmd() 11 verwendet
wird. Die Server-Struktur 30 ist eine Datenstruktur, die
in dem Speicher 4 gespeichert ist. Das Aufrufprogramm muß sicherstellen,
daß für jeden
Server, mit dem eine Verbindung hergestellt werden soll, eine Server-Struktur 30 existiert,
bevor die Routine prcmd() 11 aufgerufen wird. Eine Möglichkeit,
um die Existenz einer Server-Struktur 30 für jeden
Server, mit dem eine Verbindung hergestellt werden soll, sicherzustellen,
für das Aufrufprogramm
besteht darin, jede Server-Struktur 30 zu erzeugen und
zu initialisieren, um ein Array von Strukturen 40 zu bilden,
wie in 4 gezeigt ist. Nach dem Erzeugen des Arrays von
Strukturen 40, bei dem jedes Element des Arrays einem der
Server 23 zugeordnet ist, muß das Aufrufprogramm 12 verschiedene
Felder jeder Server-Struktur 30 initialisieren. Speziell
ist der server_identifier 31 ein Zeiger, der entweder auf
den Serversystem-Knotennamen oder die Server-Internet-Adresse von
einem der Server 23 zeigt. Die Statusvariable 32 muß auf den "NO_CONNECTION"-Zustand ("KEINE_VERBINDUNG"-Zustand) initialisiert
werden, um anzuzeigen, daß gegenwärtig keine
Verbindung zwischen dem Client 22 und dem Server 23 existiert.
Außerdem
zeigt bei dem ersten Ausführungsbeispiel
der port_or_command-Zeiger 34 (Tor_oder_Befehl-Zeiger)
auf eine Tornummer, durch die eine Verbindung zu dem Server 23 hergestellt wird.
Bei dem zweiten Ausführungsbeispiel
zeigt der port_or_command-Zeiger 34 auf einen Fernbefehl, der
zu dem Server 23 gesendet werden soll. Ein Takt timeout_clock 33 (Zeitablauf_Takt)
und ein Dateizeiger fp1 35 werden durch die Routine prcmd() 11 initialisiert.
Optional kann die Server-Struktur 30 ferner einen zweiten
Dateizeiger fp2 36 und eine close_flag 37 (Schließen_Flag
bzw. Beende_Flag) aufweisen, die später erläutert werden.
-
Der
Betrieb der Routine prcmd() 11 ist in 5 dargestellt
und wird nun beschrieben. Das Aufrufprogramm initialisiert das Array
von Strukturen 40. Danach ruft das Aufrufprogramm die Routine
prcmd() 11 wiederholt auf, um Verbindungszustände weiterzustellen,
die zwischen dem Client 22 und jedem von einem oder mehreren
Servern 23 existieren, bis alle Verbindungen entweder scheitern
oder geschlossen sind. Wenn das Aufrufprogramm 12 die Routine prcmd() 11 aufruft
(1) empfängt
die Routine prcmd() 11 das Array von Strukturen 40 von
dem Aufrufprogramm (Schritt 50), (2) versucht, eine Verbindung
für jeden
Server einzurichten, der einen Status, der gleich dem "NO_CONNECTION"-Zustand ist, aufweist
(Schritt 52), und (3) versucht, einen Verbindungszustand
für jede
Server-Struktur weiterzustellen (Schritt 53). Die Verbindungszustände unterscheiden
sich für
die unterschiedlichen Ausführungsbeispiele
und werden nachfolgend aufgezählt.
Es sei bemerkt, daß der
Verbindungszustand für
jeden Server mit einer unabhängigen
Rate weitergestellt werden kann.
-
Der
Schritt 50 bezieht sich auf das Aufrufprogramm 12,
das einen Zeiger als einen Parameter für die Routine prcmd() 11 zu
dem Array von Strukturen 40 leitet. Die Routine prcmd() 11 verwendet
den Zeiger zu dem Array von Strukturen als ei nen Referenzpunkt,
der den Beginn des Arrays von Strukturen 40 anzeigt. Die
Routine prcmd() 11 kann auf jede Server-Struktur 30 des Arrays von
Strukturen 40 zugreifen, indem sie auf einen Ort in dem
Speicher zugreift, der gleich dem Zeiger auf das Array von Strukturen plus
N mal der Größe einer
Server-Struktur ist, wobei N gleich einer ganzen Zahl größer oder
gleich Null (d.h. N = 0,1,2,....) ist. Der Schritt 52 schließt das Versuchen
der Routine prcmd() 11 ein, eine Verbindung für jeden
des einen oder der mehreren Server 23 einzurichten, der
eine zugeordnete Server-Struktur 30 aufweist, deren Statusvariable
gleich dem "NO_CONNECTION"-Zustand ist. Der
Schritt 53 schließt
das Versuchen der Routine prcmd() 11 ein, den Verbindungszustand
zwischen dem Client 22 und jedem des einen oder der mehreren
Server 23 weiterzustellen, d.h. jeder Server-Struktur 30 des
Arrays von Strukturen 40. Folglich versucht die Routine prcmd() 11 jedesmal,
wenn sie aufgerufen wird, eine Verbindung mit jedem Server einzurichten,
bevor sie versucht, jeden der Verbindungszustände zwischen dem Client 22 und
dem einen oder den mehreren Servern 23 weiterzustellen.
Daher handhabt die Routine prcmd() 11 die Einrichtung und
die Wartung der Verbindungen parallel.
-
Der
Betrieb der Routine prcmd() 11, wie er oben beschrieben
ist, überwindet
die Nachteile der Routine rcmd(). Speziell muß das Aufrufprogramm 12 nicht
auf die Fernbefehloperationen auf jedem Server warten, um abzuschließen. Vielmehr
springt die Routine prcmd() 11 zurück, nachdem sie inkremental
versucht hat, den Verbindungszustand zwischen dem Client 22 und
jedem des einen oder der mehreren Server 23 weiterzustellen.
Vorzugsweise verwendet die Routine prcmd() 11 nicht-blockierende Systemaufrufe,
so daß die
Betriebszeit jedes Aufrufs der Routine prcmd() 11 minimiert
ist. Zweitens ist das Verhalten des Aufrufprogramms 12 nicht
länger
extrem empfindlich gegenüber
Verbindungsproblemen, da die Routine prcmd() 11 das Aufrufprogramm
beim Durchführen
einer Wiederholungsoperation nicht blockiert. Drittens kann ein
Benutzer ein kundenspezifisches Server-Seiten-Programm für jeden
des einen oder der mehreren Server 23 schreiben, um in
Wechselwirkung mit der Routine prcmd() 11 zu treten, derart,
daß Verbindungen
zwischen dem Client und jedem des einen oder der mehreren Server 23 beibehalten
oder wiederverwendet werden. Dies ermöglicht es, daß das Aufrufprogramm 12 weniger
Verbindungsbetriebsmittel auf dem Client 22 verbraucht,
da nicht jedesmal, wenn der Client eine Konversation mit dem Server
führt,
eine neue Verbindung erzeugt werden muß.
-
Optional
ermöglicht
die Routine prcmd() 11, daß das Aufrufprogramm 12 der
Routine prcmd() 11 befiehlt, beliebige vorher existierende
Verbindungen zwischen dem Client 22 und jedem des einen
oder der mehreren Server 23 zu schließen bzw. zu beenden. Diese
Option macht es erforderlich, daß jede Server-Struktur 30 eine
close_flag-Variable aufweist. Jede der close_flag-Variablen 37 des
Arrays von Strukturen 40 muß auf den "DO_NOT_CLOSE"-Zustand ("SCHLIEßE_NICHT"-Zustand) initialisiert werden. Wenn
das Aufrufprogramm 12 wünscht,
eine Verbindung zwischen dem Client 22 und einem Server
zu schließen,
muß das
Aufrufprogramm close_flag 37 der Server-Struktur 30,
die dem Server zugeordnet ist, auf den "CLOSE"-Zustand ("SCHLIEßE"-Zustand) setzen. Der Schritt 51,
der in 5 gezeigt ist, schließt eine Verbindung zwischen
dem Client 22 und jedem des einen oder der mehreren Server 23,
deren close_flag den "CLOSE"-Zustand aufweist.
-
6 zeigt
den Schritt 51 (5) detaillierter. Der Schritt 60 schließt das Springen
der Routine prcmd() 11 zu dem Beginn des Arrays von Strukturen 40 ein.
Der Schritt 61 bestimmt, ob die Routine prcmd() 11 am
Ende des Arrays von Strukturen 40 ist. Wenn die Routine
prcmd() 11 nicht am Ende des Arrays von Strukturen 40 ist,
springt die Routine vom Schritt 61 zu einem Schritt 62,
in dem auf eine Server-Struktur 30 aus
dem Array von Strukturen 40 zugegriffen wird. In einem
Schritt 63 wird bestimmt, ob close_flag 37 der
Server-Struktur 30 den"CLOSE"-Zustand aufweist.
Wenn close_flag 37 den "CLOSE"-Zustand aufweist,
springt die Routine vom Schritt 63 zu einem Schritt 64,
der die Verbindung zu dem Server, der durch den server_identifier-Zeiger 31 der
Server-Struktur identifiziert ist, schließt. In einem Schritt 65 wird
die Statusvariable 32 der Server-Struktur 30 auf
den "DONE"-Zustand ("ERLEDIGT"-Zustand) gesetzt.
In einem Schritt 66 wird die Routine prcmd() 11 auf
die nächste
Server-Struktur 30 des Arrays von Server-Strukturen 40 gerichtet. Wenn
close_flag 37 nicht den "CLOSE"-Zustand aufweist, d.h., wenn close_flag 37 den "DO_NOT_CLOSE"-Zustand aufweist, überspringt die
Routine prcmd() 11 die Schritte 64 und 65 und springt
direkt zu dem Schritt 66. Wenn im Schritt 61 bestimmt
wird, daß die
Routine prcmd() 11 am Ende des Arrays von Strukturen (Schritt 61)
ist, wird vom Schritt 51 zurückgesprungen, wobei die Routine prcmd() 11 zu
dem Schritt 52 springt, wie in 5 gezeigt
ist.
-
Für den Schritt 51 ist
ein beliebiger Schleifenbefehl geeignet. Beispielsweise kann in
C die Schleife unter Verwendung einer for-Schleife einer while-Schleife
oder einer dowhile-Schleife implementiert sein.
-
7 liefert
ein Flußdiagramm
des Schritts 52 (5), welcher
nun detaillierter erläutert
wird. Ein Schritt 70 richtet die Routine prcmd() 11 auf
den Beginn des Arrays von Strukturen 40. In einem Schritt 71 wird
bestimmt, ob die Routine prcmd() 11 am Ende des Arrays
von Strukturen 40 ist. Wenn die Routine prcmd() 11 nicht
am Ende des Arrays von Strukturen 40 ist, springt die Routine
vom Schritt 71 zu einem Schritt 72, in dem auf
eine Server-Struktur 30 aus dem Array von Strukturen 40 zugegriffen
wird. In einem Schritt 73 wird bestimmt, ob die Server-Struktur 30,
auf die zugegriffen wurde, eine Statusvariable 32 aufweist,
die gleich dem "NO_CONNECTION"-Zustand, ist. Wenn
die Statusvariable 32 nicht gleich dem "NO_CONNECTION"-Zustand ist, springt die Routine vom
Schritt 73 zu einem Schritt 79. Wenn die Statusvariable 32 gleich "NO_CONNECTION" ist, springt die
Routine vom Schritt 73 zu einem Schritt 74. Im
Schritt 74 wird bestimmt, ob der Client 22 ausreichend
Betriebsmittel aufweist, um eine weitere Verbindung einzurichten.
Beispiels weise kann dem Client 22 eine verfügbare, reservierte
Tornummer fehlen (wie nachfolgend erläutert wird), wodurch verhindert
wird, daß der
Client 22 eine Verbindung mit dem Server, der durch server_identifier 31 der
Server-Struktur 30, auf die zugegriffen wurde, identifiziert
ist, einrichtet. Wenn der Client 22 ausreichend Betriebsmittel
aufweist, springt die Routine vom Schritt 74 zu einem Schritt 75,
welcher den Client 22 für
die Verbindung vorbereitet. Ein Schritt 76 schließt den Versuch
der Routine prcmd() 11 ein, eine Verbindung mit dem identifizierten
Server herzustellen. Bei dem ersten Ausführungsbeispiel schließt dies
das Herstellen einer Verbindung mit der Tornummer, die durch port_or_command 34 spezifiziert
ist, ein. Bei dem zweiten Ausführungsbeispiel
schließt
dies das Herstellen einer Verbindung zu der Standardtornummer für den remsh-Dienst
ein. In einem Schritt 77 wird die Statusvariable 32 auf
den "CONNECTION_1"-Zustand ("VERBINDUNG_1"-Zustand) eingestellt.
Im Schritt 78 wird ein timeout_clock 33 für den Server
gestartet, der durch die Server-Struktur 30 identifiziert
ist. Im Schritt 79 wird die Routine prcmd() 11 auf
die nächste Server-Struktur 30 in
dem Array von Strukturen 40 gerichtet. Wenn im Schritt 71 bestimmt
wird, daß die Routine
prcmd() 11 am Ende des Arrays von Strukturen 40 ist,
wird im Schritt 71 ein Rücksprung zu dem Schritt 52 bewirkt,
so daß die
Routine prcmd() 11 zu dem Schritt 53 springen
kann.
-
Der
Schritt 76 (siehe 7) kann
die Routine connect() verwenden, um die Verbindung zwischen dem
Client 22 und dem Server zu initiieren. Obwohl im Schritt 76 ein
blockierendes connect() (verbinde()) verwendet werden kann, ist
ein nicht-blockierendes connect() bevorzugt, um das Verhalten der
Routine prcmd() 11 zu verbessern.
-
8 zeigt
weitere Einzelheiten des Schritts 75 (7),
welcher nun erläutert
wird. Die Routine prcmd() richtet Verbindungen mit jedem des einen oder
der mehreren Server 23 unter Verwendung einer binären Netzwerkadresse
für jeden
Server ein. In einem Schritt 80 wird bestimmt, ob der Ser ver-Identifizierer 31 der
Server-Struktur 30 auf eine binäre Netzwerkadresse abgebildet
wurde (d.h. umgewandelt wurde). Wenn der Server-Identifizierer 31 nicht abgebildet
wurde, springt die Routine vom Schritt 80 zu einem Schritt 81.
Andernfalls springt die Routine von dem Schritt 80 zu einem
Schritt 82. Im Schritt 81 wird der Server-Identifizierer 31 in
eine binäre
Form abgebildet. Im Schritt 82 wird ein Client-Seiten-Endpunkt
für ein
Ende der Verbindung zwischen dem Client 22 und dem Server
vorbereitet.
-
9 zeigt
weitere Einzelheiten des Schritts 81 (8),
welcher nun erläutert
wird. In einem Schritt 84 wird bestimmt, ob der Server-Identifizierer 31 der
Server-Struktur 30 eine Adresse ist. Wenn der Server-Identifizierer 31 eine
Adresse ist, springt die Routine vom Schritt 84 zu einem
Schritt 86. Wenn server_identifier 31 keine Adresse
ist, springt die Steuerung von dem Schritt 84 zu einem
Schritt 85, in dem der Server-Identifizierer auf eine oder
mehrere Adressen abgebildet wird, wobei jede Adresse den Server
identifiziert. Im Schritt 86 werden die eine oder die mehreren
Adressen zur Verwendung durch den Client 22 in eine binäre Form
abgebildet, um eine Verbindung mit dem Server einzurichten.
-
10 zeigt
weitere Einzelheiten des Schritts 82 (8),
der nun erläutert
wird. In einem Schritt 87 wird ein Sockel (socket) erzeugt
und ein Sockel-Deskriptor für
die Verbindung zwischen dem Client 22 und dem Server gespeichert.
In einem Schritt 88 wird der Sockel an eine reservierte
Tornummer gebunden. Es sei in Erinnerung gerufen, daß im Schritt 74 bestimmt
wurde, das Tornummern verfügbar
sind. Vorzugsweise findet der Aufruf von Betriebsmitteln (Schritt 75)
und die Überprüfung nach ausreichenden
Betriebsmitteln (Schritt 74) gleichzeitig statt, um Wettlaufsituationen
zu vermeiden. In einem Schritt 89 wird der gespeicherte
Sockel-Deskriptor des Schritts 87 auf einen Strom-Zeiger
(stream pointer) abgebildet, der in dem Dateizeiger fp1 35 der Server-Struktur 30 gespeichert
ist. Das Aufrufprogramm 12 kann aus dem Datenstrom lesen
(beispielsweise die Ergebnisse des Fernbefehls von dem Server),
und Daten unter Verwendung des Dateizeigers fp1 35 zu dem
Fernbefehl- oder Kunden-Dämon senden.
Die Routine prcmd() 11 kann die Routinen socket(), bind()
und fdopen() für
die Schritte 87, 88 bzw. 89 verwenden,
so daß das
Aufrufprogramm 12 sich nicht mit diesen Aufgaben abgeben
muß.
-
11 liefert
weitere Einzelheiten des Schritts 53 (5),
der nun erläutert
wird. In einem Schritt 90 wird die Routine prcmd() 11 auf
den Beginn des Arrays von Strukturen 40 gerichtet. In einem Schritt 91 wird
bestimmt, ob die Routine prcmd() 11 am Ende des Arrays
von Strukturen 40 ist. Wenn dies nicht der Fall ist, springt
die Routine vom Schritt 91 zu einem Schritt 92,
in dem auf eine Server-Struktur 30 des
Arrays von Strukturen 40 zugegriffen wird. Ein Schritt 93 schließt das Aktualisieren
einer Auswahlliste 13 gemäß dem Status 32 der
Server-Struktur 30 ein. In einem Schritt 107 wird
zu der nächsten
Server-Struktur 30 in dem Array von Strukturen 40 gesprungen.
Wenn im Schritt 91 bestimmt wird, daß die Routine prcmd() 11 am
Ende des Arrays von Strukturen 40 ist, springt die Routine
vom Schritt 91 zu einem Schritt 108. Im Schritt 108 wird
bestimmt, ob die Auswahlliste leer ist. Wenn dies der Fall ist,
bewirkt der Schritt 108 einen Rücksprung vom Schritt 53.
Andernfalls springt die Routine vom Schritt 108 zum Schritt 94.
Im Schritt 94 werden Auswahlergebnisse zwischen dem Client 22 und
jedem der Server 23 in der Auswahlliste 13 erhalten,
d.h. die Routine prcmd() 11 überprüft den Status der Verbindung
zwischen dem Client 22 und jedem des einen oder der mehreren
Server 23 auf der Auswahlliste 13. In einem Schritt 95 wird
die Routine prcmd() 11 auf den Beginn des Arrays von Strukturen 40 gerichtet.
In einem Schritt 96 wird bestimmt, ob die Routine prcmd() 11 am
Ende des Arrays von Strukturen 40 ist. Wenn dies nicht
der Fall ist, springt die Routine vom Schritt 96 zu einem
Schritt 97, der auf eine Server-Struktur 30 des Arrays von
Strukturen 40 zugreift. Ein Schritt 98 umfaßt (1) das
Analysieren des Auswahlergebnisses zwischen dem Client 22 und
dem Server, der der Server-Struktur 30, auf die zugegriffen
wurde, zugeordnet ist, wenn der Server-Identifizierer auf der Auswahlliste 13 ist,
und (2) das Aktualisieren der Statusvariable 32 der Server-Struktur 30,
auf die zugegriffen wurde, wenn das Auswahlergebnis anzeigt, daß der Verbindungszustand
weitergestellt wurde. Im Schritt 99 wird zu der nächsten Server-Struktur 30 in dem
Array von Strukturen 40 geschaltet. Wenn im Schritt 96 bestimmt
wird, daß die
Routine prcmd() 11 am Ende des Arrays von Strukturen 24 ist,
folgt ein Rücksprung
vom Schritt 53 und die Routine prcmd() 11 ist
abgeschlossen.
-
Es
sollte offensichtlich sein, daß in
den Schritten 95 bis 99 jede Server-Struktur des
Arrays von Strukturen 40 überquert wird, selbst wenn
der Nettoeffekt darin besteht, nur auf die Server-Strukturen auf
der Auswahlliste zuzugreifen. Alternativ kann die Auswahlliste überquert
werden, so daß Server-Strukturen,
die nicht auf der Auswahlliste sind, nicht berücksichtigt werden. Jedoch verwendet
das bevorzugte Verfahren die Schritte 95 bis 99,
wie sie gezeigt sind, da diese Schritte schnell und wirksam einen
Zugriff auf die Statusvariable 32 der Server-Strukturen 30 für eine Aktualisierung
liefern.
-
12 zeigt
ein erstes Ausführungsbeispiel des
Schritts 93 (11). Bei dem ersten Ausführungsbeispiel
kommuniziert die Routine prcmd() 11 mit einem kundenspezifischen
Dämon,
der auf dem einen oder den mehreren Servern 23 läuft. In
einem Schritt 100 wird bestimmt, ob die Statusvariable 32 der
Server-Struktur 30 entweder gleich dem "CONNECT_1"-Zustand, dem "READ_WAIT"-Zustand oder dem "READ_READY"-Zustand ist. Wenn dies der Fall ist,
wird der Server Identifizierer 31 der Server-Struktur zu
der Auswahlliste 13 hinzugefügt. Andernfalls erfolgt ein
Rücksprung
vom Schritt 93.
-
13 zeigt
ein bevorzugtes zweites Ausführungsbeispiel
des Schritts 93 (11). Bei
dem bevorzugten zweiten Ausführungsbeispiel
kommuniziert die Routine prcmd() 11 mit dem einen oder
den mehreren Servern 23 unter Verwendung des Protokolls
remsh. In diesem Fall ist kein kundenspezifischer Dämon notwendig,
und die Routine prcmd() 11 verwendet den Server-seitigen
Dämon inetd
und den Dämon
remshd, die gegenwärtig
mit dem UNIX-Betriebssystem geliefert werden. In einem Schritt 105 wird
bestimmt, ob die Statusvariable 32 der Server-Struktur 30 entweder
gleich dem "CONNECT_1"-Zustand, dem "CONNECT_2"-Zustand, dem "CONNECT_3"-Zustand, dem "READ_WAIT"-Zustand oder dem "READ_READY"-Zustand ist. Wenn
dies der Fall ist, springt die Routine vom Schritt 105 zu
einem Schritt 106, der das Hinzufügen des Server-Identifizierers 31 der
Server-Struktur 30, auf die zugegriffen wurde, zu der Auswahlliste 13 einschließt. Andernfalls
wird im Schritt 105 einfach ein Rücksprung vom Schritt 93 bewirkt.
-
Der
Schritt 98 (11) wird nun detaillierter in
Verbindung mit dem ersten Ausführungsbeispiel erläutert. Zuerst
ruft der Schritt 98 eine Routine gemäß dem Wert der Statusvariable 32 der
Server-Struktur 30, auf die zugegriffen wurde, auf. 14 zeigt
einen Schaltbefehl, der in der Programmiersprache C geschrieben
ist, der bestimmt, welche Routine aufgerufen werden soll. Wenn die
Statusvariable 32 gleich dem "CONNECT_1"-Zustand ist, springt die Routine vom
Schritt 98 zu der connect1_routine() 110. Wenn
die Statusvariable 32 gleich dem "READ_WAIT"-Zustand ist, wird im Schritt 98 read_wait_routine() 114 aufgerufen.
Wenn die Statusvariable 32 gleich dem "READ_READY"-Zustand ist, wird im Schritt 98 read_ready_routine() 115 aufgerufen.
-
Die
Routine connect1_routine() 110 (14) ist
in 16 dargestellt und wird nun detailliert erläutert. In
einem Schritt 120 wird bestimmt, ob die Verbindung zwischen
dem Client 22 und dem einen der Server 23 für ein Schreiben
bereit ist. Wenn dies der Fall ist, springt die Routine vom Schritt 120 zu
einem Schritt 124. Im Schritt 124 wird die Statusvariable 32 der
Server-Struktur 30 gleich dem "READ_WAIT"-Zustand eingestellt. In einem Schritt 125 wird
timeout_clock 33 der Server-Struktur 30 rückgesetzt.
Wenn im Schritt 20 bestimmt wird, daß die Verbindung zwischen dem
Client und dem Server nicht bereit für ein Schreiben ist, springt
die Routine vom Schritt 120 zu einem Schritt 126,
der bestimmt, ob eine Zeitablaufbedingung aufgetreten ist, indem auf
timeout_clock 33 zugegriffen wird. Wenn keine Zeitablaufbedingung
aufgetreten ist, wird im Schritt 126 ein Rücksprung
vom Schritt 110 bewirkt. Andernfalls wird in einem Schritt 127 die
Zustandsvariable 32 gleich dem "ERROR"-Zustand
("FEHLER"-Zustand) eingestellt.
In einem Schritt 128 wird die Verbindung geschlossen. In
dem Schritt 128 kann die Verbindung durch das Durchführen einer
Schließoperation
auf dem Datei-Deskriptor fp1 35 der Server-Struktur 30 geschlossen
werden. Im Schritt 129 wird bestimmt, ob eine weitere Adresse
für den
Server verfügbar
ist. Wenn dies der Fall ist, wird die Statusvariable 32 auf
den "NO_CONNECTION"-Zustand eingestellt,
um der Routine prcmd() 11 anzuzeigen, zu versuchen, beim
nächsten
Aufruf der Routine prcmd() 11 eine neue Verbindung zwischen
dem Client und dem Server einzurichten. Wenn keine andere Adresse
verfügbar
ist, wird im Schritt 129 ein Rücksprung vom Schritt 110 bewirkt.
-
Die
read_wait_routine() 114 (14) ist
detailliert in 20 gezeigt. In einem Schritt 160 wird bestimmt,
ob die Verbindung für
ein Lesen bereit ist. Wenn dies nicht der Fall ist, wird im Schritt 160 ein Rücksprung
des Schritts 114 bewirkt. Wenn die Verbindung für ein Lesen
bereit ist, springt die Routine vom Schritt 160 zu einem
Schritt 161, in dem die Statusvariable 32 der
Server-Struktur 30 gleich dem "READ_READY"-Zustand eingestellt wird.
-
Die
read_ready_routine() 115 (14) ist detailliert
in 21 gezeigt. In einem Schritt 165 wird bestimmt,
ob die Verbindung für
ein Lesen bereit ist. Wenn dies der Fall ist, wird im Schritt 165 ein
Rücksprung
des Schritts 115 bewirkt. Andernfalls springt die Routine
vom Schritt 165 zu einem Schritt 166, in dem die
Statusvariable 32 der Server-Struktur 30 gleich
dem "READ-WAIT"-Zustand eingestellt
wird.
-
Bei
dem bevorzugten zweiten Ausführungsbeispiel
wird im Schritt 98 (11) bestimmt,
welche Routine gemäß der Statusvariable 32 der
Server-Struktur 30 aufgerufen werden soll. 15 zeigt einen
Schaltbefehl, der in der Programmiersprache C geschrieben ist, der
bestimmt, welche Routine aufgerufen werden soll. Wenn die Statusvariable 32 gleich dem "CONNECT_1"-Zustand ist, wird
im Schritt 98 die Routine connect_1() 111 aufgerufen.
Wenn die Statusvariable 32 gleich dem "CONNECT_2"-Zustand ist, wird im Schritt 98 connect2_routine() 112 aufgerufen.
Wenn die Statusvariable 32 gleich dem "CONNECT_3"-Zustand ist, wird im Schritt 98 connect3_routine() 113 aufgerufen.
Wenn die Statusvariable 32 gleich dem "READ_WAIT"-Zustand ist, wird im Schritt 98 read_wait_routine() 114 aufgerufen.
Wenn die Statusvariable 32 gleich dem "READ_READY"-Zustand ist, wird im Schritt 98 read_ready_routine() 115 aufgerufen.
Aus einem Vergleich von 14 mit 15 sollte
offensichtlich sein, daß sich
das bevorzugte zweite Ausführungsbeispiel
des Schritts 98 von dem ersten Ausführungsbeispiel des Schritts 98 darin
unterscheidet, daß es connect2_routine() 112 und
connect3_routine() 113 aufweist. Außerdem ist connect1_routine() 110 durch connect1_routine() 111 ersetzt
ist. Die Modifikationen und Zusätze
passen das Protokoll remsh an, derart, daß die Routine prcmd() 11 unter
Verwendung des Dämons
inetd und des Dämons
remshd eine Verbindung zu einem Server herstellen kann. Dies liefert den
Vorteil, daß es
nicht erforderlich ist, daß der
Benutzer einen Dämon
für den
Server schreibt, ebenso wie es die zusätzlichen Vorteile des Verwendens
eines Standarddienstes liefert, der eine Zugriffssteuerung, eine
Befehlslinien-Benutzeroberflächen-Interpretation
(command line shell interpretation) und ein Standardfehlertor liefert.
-
17 zeigt
connect1_routine() 111 (15) für das bevorzugte
zweite Ausführungsbeispiel.
Der Zeitablaufzweig 132 für connect1_routine() 111 ist
der gleiche wie der Zeitablaufzweig 131 für connect1_routine() 110 (vergleiche 17 mit 16),
mit der Ausnahme, daß beide
Verbindungen, die fp1 35 und fp2 36 zugeordnet
sind, geschlossen sind, und wird nicht weiter erläutert. Wenn
im Schritt 120 bestimmt wird, daß die Verbindung zwischen dem
Client 22 und dem Server nicht für ein Schreiben bereit ist,
springt die Routine vom Schritt 120 zu dem Zeitablaufzweig 132.
Andernfalls springt die Routine vom Schritt 120 zu einem
Schritt 121. Im Schritt 121 wird versucht, eine
Fehlerverbindung zwischen dem Client 22 und dem Server
einzurichten. In einem Schritt 122 werden Standardzugriffs-Steuerinformationen
und der Fernbefehl, der durch den port_or_command-Zeiger 34 der
Server-Struktur 30 angezeigt ist, geschrieben. Im Schritt 123 wird
die Zustandsvariable 32 gleich dem "CONNECT_2"-Zustand eingestellt. Im Schritt 125 wird
timeout_clock 33 der Server-Struktur 30 rückgesetzt.
-
Die
Routine connect2-routine() 112 (15) ist
in 18 gezeigt. In einem Schritt 140 wird
bestimmt, ob die Fehlerverbindung für ein Lesen bereit ist. Wenn
dies der Fall ist, wird im Schritt 141 die Fehlerverbindung
angenommen. Der Schritt 141 kann unter Verwendung der Routine
accept(), die durch das UNIX-Betriebssystem geliefert wird, implementiert
sein. Der Schritt 141 schließt außerdem das Speichern eines
Dateizeigers auf den Fehlerstrom in dem Dateizeiger fp2 36 der
Server-Struktur 30 für
einen Zugriff durch das Aufrufprogramm 12 (siehe 3 und 4)
ein. Ein Schritt 142 stellt die Statusvariable 32 der
Server-Struktur 30 gleich dem "CONNECT_3"-Zustand ein. In einem Schritt 143 wird
timeout_clock 33 der Server-Struktur 30 rückgesetzt.
Wenn im Schritt 140 bestimmt wird, daß die Fehlerverbindung nicht
bereit für
ein Lesen ist, wird in einem Schritt 144 bestimmt, ob fp1 35 bereit
für ein Lesen
ist. Wenn fp1 35 bereit für ein Lesen ist, was bedeutet,
daß der
Dämon remshd
eine Fehlermeldung zurückgegeben
hat, springt die Routine vom Schritt 144 zu einem Schritt 146,
in dem die Statusvariable 32 der Server-Struktur 30 gleich
dem "ERROR"-Zustand eingestellt
wird. Wenn fp1 35 nicht bereit für ein Lesen ist, wird in einem
Schritt 145 bestimmt, ob eine Zeitablaufbedingung aufgetreten
ist. Wenn keine Zeitablaufbedingung aufgetreten ist, wird im Schritt 145 ein
Rücksprung
des Schritts 112 bewirkt. Andernfalls springt die Routine
vom Schritt 145 zum Schritt 146. Im Schritt 156 wird
die Statusvariable 32 gleich dem "ERROR"-Zustand eingestellt. In einem Schritt 147 werden
die Verbindungen geschlossen. In einem Schritt 158 wird
bestimmt, ob eine weitere Adresse für den Server verfügbar ist. Wenn
dies nicht der Fall ist, wird im Schritt 148 ein Rücksprung
des Schritts 112 bewirkt. Andernfalls springt die Routine
vom Schritt 148 zu einem Schritt 149, in dem die
Statusvariable 32 gleich dem "NO_CONNECTION"-Zustand eingestellt wird.
-
19 zeigt
connect3_routine() 113 (15). In
einem Schritt 150 wird bestimmt, ob die Verbindung bereit
für ein
Lesen ist. Wenn dies der Fall ist, wird in einem Schritt 151 der
Client 22 für
ein Lesen vorbereitet. Beispielsweise sendet das Protokoll remsh
ein Null-Byte zu dem Client 22 zurück, bevor der Datenstrom gesendet
wird. Der Schritt 151 kann den Schritt des Verarbeitens
des Null-Bytes (d.h. des Lesens und des Löschens des Null-Bytes) oder
alternativ des Bestimmens, ob das erste Byte das Null-Byte ist,
aufweisen, und wenn dies nicht der Fall ist, das Einstellen der
Statusvariable 32 auf den "ERROR"-Zustand, um einen remshd-Dämon-Ausfall anzuzeigen
und einen Rücksprung
vom Schritt 113 zu bewirken. In einem Schritt 152 wird
die Statusvariable 32 gleich dem "READ_WAIT"-Zustand eingestellt. In einem Schritt 158 wird
timeout_clock 33 rückgesetzt.
Wenn die Verbindung nicht für
ein Lesen bereit ist, springt die Routine vom Schritt 150 zu
einem Schritt 153, in dem bestimmt wird, ob eine Zeitablaufbedingung
aufgetreten ist. Wenn dies nicht der Fall ist, wird im Schritt 153 ein
Rücksprung
vom Schritt 113 bewirkt. Andernfalls springt die Routine vom
Schritt 153 zu einem Schritt 154. Im Schritt 154 wird
die Statusvariable 32 gleich dem "ERROR"-Zustand eingestellt. In einem Schritt 155 werden
die Verbindungen geschlossen. In einem Schritt 156 wird bestimmt,
ob eine weitere Adresse für
den Server verfügbar
ist. Wenn keine weitere Adresse verfügbar ist, wird im Schritt 156 ein
Rücksprung
vom Schritt 113 bewirkt.
-
Andernfalls
springt die Routine vom Schritt 156 zu einem Schritt 157,
in dem die Statusvariable 32 gleich dem "NO_CONNECTION"-Zustand eingestellt
wird.
-
Die
read_wait_routine() 114 und read_ready_routine() 115 für das bevorzugte
zweite Ausführungsbeispiel
sind in den 20 bzw. 21 dargestellt
und oben beschrieben. Diese beiden Routinen sind die gleichen wie
für das
erste Ausführungsbeispiel.
-
Es
sei bemerkt, daß das
Aufrufprogramm 12 fortfahren kann, die Routine prcmd() 11 aufzurufen, um
jede sich ergebende Konversation mit dem Fernbefehl oder dem Kunden-Dämon auf
einem spezifischen Server zu leiten.
-
Zahlreiche
Verbesserungen sind zu erkennen und sind dazu bestimmt, innerhalb
des Bereichs der Erfindung zu liegen. Beispielsweise kann der Schritt
des Rücksetzens
von timeout_clock 33 der Server-Struktur 30 einfach
das Kopieren der aktuellen Zeit des Clients 22 in timeout_clock 33 einschließen. Dann
kann in dem Schritt des Bestimmens, ob eine Zeitablaufbedingung
aufgetreten ist, die aktuelle Zeit des Clients 22 mit der
vorher gespeicherten aktuellen Zeit in timeout_clock 33 verglichen
werden. wenn der Unterschied zwischen der aktuellen Zeit, die gegenwärtig durch
den Client 22 angezeigt wird, und der vorher gespeicherten
aktuellen Zeit in timeout_clock 33 größer als eine vorbestimmte Schwelle
ist, beispielsweise 30 Sekunden, schließt die Routine prcmd() 11 daraus,
daß eine
Zeitablaufbedingung aufgetreten ist. Wenn der Unterschied kleiner
als oder gleich der vorbestimmten Schwelle ist, bestimmt die Routine
prcmd() 11, daß keine
Zeitablaufbedingung aufgetreten ist.
-
Außerdem kann
das Ablaufzeitintervall durch das Aufrufprogramm 12 einstellbar
sein.
-
Zusätzlich kann
die Routine prcmd() 11 weite robustere Fehleranzeigemerkmale
aufweisen. Beispielsweise kann der Schritt des Einstellens der Statusvariable 32 gleich
dem "ERROR"-Zustand nach dem
Bestimmen, daß eine
Zeitablaufbedingung aufgetreten ist, durch einen Schritt des Einstellens
der Statusvariable 33 gleich einem "TIMEOUT_ERROR"-Zustand ("ZEITABLAUF_FEHLER"-Zustand) ersetzt werden. Außerdem kann,
wenn im Schritt 144 (siehe 18) bestimmt
wird, daß stdout
für ein
Lesen bereit ist, die Routine vom Schritt 144 zu einem
unabhängigen Schritt
des Einstellens der Statusvariable 32 gleich einem "REMSHD_ERROR"-Zustand und des
Aufzeichnens der Fehlermeldung von remshd springen. Folglich ermöglicht die
Verwendung von detaillierteren Fehlerzuständen, daß das Aufrufprogramm besser
identifiziert, wo Probleme auftreten.
-
Ferner
ist server_identifier 31 der Server-Struktur 30 ein
Zeiger auf eine Zeichenfolge. Jedoch kann dieser Zeiger durch eine
Zeichenfolge ersetzt werden, um einen Umwegpegel zu beseitigen. In
gleicher Weise kann der port_or-command-Zeiger 34 für das erste Ausführungsbeispiel
bzw. das zweite Ausführungsbeispiel
durch entweder einen Wert oder eine Zeichenfolge ersetzt werden,
um einen Umwegpegel zu beseitigen.
-
Ferner
ist die Routine prcmd() 11 bei einem bevorzugten Ausführungsbeispiel
in der Programmiersprache C geschrieben. Jedoch kann die Routine
prcmd() 11 unter Verwendung anderer Sprachen, beispielsweise
FORTRAN oder PASCAL implementiert sein, oder sogar unter Verwendung
von einer objektorientierten Sprache, beispielsweise C++ oder ADA.
-
Die
Routine prcmd() 11, wie oben beschrieben, ist unter Verwendung
von BSD-Sockeln implementiert. Alternativ kann die Routine prcmd() 11 unter Verwendung
eines beliebigen Verbindungsprotokolls implementiert werden, das
eine Verbindungsvorrichtung verwendet, beispielsweise DCE-Dienste
(DCE = Distributed Computing Environment = verteilte Computerumgebung).
-
Des
weiteren kann die Routine prcmd() 11 beim Erfassen eines Fehlers
zwischen dem Client und einem speziellen Server unmittelbar versuchen, eine
andere Verbindung zu dem Server einzurichten, statt nur die Statusvariable 32 der
zugeordneten Server-Struktur 30 gleich dem "NO_CONNECTION"-Zustand einzustellen
(siehe beispielsweise den Schritt 130 in den 16 und 17).
Die Routine prcmd() 11 sollte verifizieren, daß zumindest
eine zusätzliche unversuchte
Internet-Adresse für
den Server verfügbar
ist, bevor unmittelbar versucht wird, eine andere Verbindung neu
einzurichten.
-
Ferner
sollte offensichtlich sein, daß einige der
Schritte, die nacheinander stattfinden, in einer unterschiedlichen
Reihenfolge durchgeführt
werden können.
Beispielsweise können
die Schritte 76 bis 78 in 7 in einer
unterschiedlichen Reihenfolge durchgeführt werden und ergeben noch
den gleichen Betrieb.
-
Das
zweite Ausführungsbeispiel
der Routine prcmd() 11 erfordert die Verwendung von Reservierungstoren,
um das Protokoll remshd zu unterstützen. Dagegen erfordert das
erste Ausführungsbeispiel
nicht die Verwendung der Reservierungstore, da das erste Ausführungsbeispiel
Konversationen mit kundenspezifischen Server-seitigen Dämonen führt.
-
Die
Routine prcmd() 11 umfaßt bei dem zweiten Ausführungsbeispiel
das Senden von Zugriffssteuerinformationen, wie es durch das Protokoll remshd
erforderlich ist. Obwohl es bei dem ersten Ausführungsbeispiel nicht erforderlich
ist, ähnliche Steuerüberprüfungen,
die durch das Protokoll remsh geboten werden, zu implementieren,
kann das erste Ausführungsbeispiel
die Steuerüberprüfungen implementieren,
wenn dieselben erwünscht
sind. Beispielsweise kann die Verwendung von Steuerüberprüfungen besonders
wichtig sein, wenn die Netzwerksicherheit strittig ist.
-
Darüber hinaus
liefert das Protokoll remshd ein Fehlerverbindungsmerkmal. Speziell
richtet der Dämon
remsh, der auf dem Server läuft,
typischerweise eine Fehlerverbindung von dem Server zurück zu dem
Client ein. Jedoch kann gemäß dem Protokoll remsh
dem Dämon
remsh befohlen werden, die Fehlerverbindung nicht einzurichten,
wenn eine Null-Tornummer von dem Client empfangen wird. Dies liefert die
Option, das Fehlerverbindungsmerkmal nicht zu verwenden. Das zweite
Ausführungsbeispiel
der Erfindung kann ermöglichen,
daß das
Aufrufprogramm das Fehlerverbindungsmerkmal unter Verwendung eines
Funktionsparameters deaktiviert, um der Routine prcmd() 11 anzuzeigen,
daß die
Fehlerverbindung nicht erwünscht
ist. In dieser Situation ist der Datei-Deskriptor fp2 36 unnötig. Folglich
ist der Datei-Deskriptor fp2 36 optional.
-
Ferner
kann die Routine prcmd() 11 verbessert werden, indem ein
Merkmal hinzugefügt
wird, das Zeitabläufe
erfaßt,
die während
sich ergebender Konversationen zwischen dem Aufrufprogramm 12 und
den Fernbefehl- oder Kunden-Dämonen
auf dem einen oder den mehreren Servern 23 auftreten.