- Erforderliche Header-Dateien
- stdio.h
- stream.h
- dii.h, schließt die folgenden Dateien ein:
- Der Server-Stub, Stubs.h, dienst als Dispatcher für beim Server eingehende entfernte Prozeduraufrufe, welche an zuvor registrierte Callback-Funktionen weitergeleitet werden.
- Die Klasse Server.h kapselt alle kommunikationsrelevanten Komponenten des Servers zum Anwendungscode hin ab.
- base_value.h definiert die Basisklasse Values, welche Basiseigenschaften (z.B. den TypeCode) und -methoden festlegt ( z.B. für die Konvertierung von Parameterwerten von der lokalen, rechnerspezifischen Syntax in eine Transfersyntax).
- Values.h enthält den Klassenbaum aller DII-Parameterdatentypen als von Value abgeleitete Klassen.
- Instanziierung des Servers: Ein Dispatcher wird mit dem Konstruktor SStub erzeugt:
SStub sstub; // Der Server-Stub
SStub *pSStub=&sstub; // Zeiger auf den Server-Stub
SVCID SvcID; // Identifikationsstruktur des Servers
Server server(&SvcID, &sstub); // Der eigentliche Server mit dem Server-Stub
// sstub und der Ident.Struktur SvcID
- Registrieren der Callback-Funktionen
sstub.RegisterFunc(COSM_OP_BIND, COSMBindCB);
sstub.RegisterFunc("ReverseString", CallBack1);
sstub.RegisterFunc("Increment", CallBack2);
sstub.RegisterFunc("Multiply", CallBack3);
- Registrieren des Servers über seine Schnittstellen-ID
SvcID.nRpc = COSM_RPC_TYPE; // Verwendeter RPC (SUN-Rpc)
SvcID.nProgID = COSM_RPC_PROG_ID; // ProgrammID des SUN-Rpc
SvcID.nVersID = COSM_RPC_VERS_ID; // VersionsID des SUN-Rpc
SvcID.pszSvcClass = COSM_RPC_SVC_CLASS; // bei SUN-Rpc immer ""
SvcID.pszSvcHostName = szHostName; // Name des lokalen Rechners
- Starten des Servers als Dämon
Server.Run();
- Die COSM-notwendige Callback-Funktion Bind
Value *COSMBindCB( NVList *pnvl )
// pnvl ist ein Zeiger auf die NVList, die die Parameter enthaelt (hier leer).
{
NVList *back = new NVList(); // Anlegen einer NVList
// Einfuegen eines Parameters vom Typ AsciiFile in die NVList back
// unter dem Namen "COSMBindCCB".
(back)->add_item("COSMBindCCB",
new AsciiFile("../ccbs/cosmsvc.dat",
FALSE) // don't delete file after recpt
);
// Ergebnisparameter zurueckgeben
return(back);
}
- Eine exemplarische Callback-Funktion zum Multiplizieren zweier Integer:
Value *CallBack3( NVList *param )
{
int i,j;
NVList *back = new NVList(); // Anlegen einer NVList
// Ausgeben der uebergebenen Parameter
cout << "Received Invocation \"Multiply\" from Generic Client:\n" << endl;
cout << "Parameters: " << param << endl;
// Extrahieren der Parameter "Multiply1" und "Multiply2" aus
// der NVList param.
// Die Methode get_item gibt einen Zeiger auf Value zurueck.
// Dieser muss in einen Zeiger auf integer konvertiert werden.
i = (int )((integer*)(param->get_item("Multiply1")))->get_value();
j = (int )((integer*)(param->get_item("Multiply2")))->get_value();
// Das Ergebnis der Multiplikation als Parameter vom Typ integer
// in die NVList back einfuegen.
(back)->add_item("Product", new integer(i*j));
// Die NVList back als Funktionsergebnis zurueckgeben.
return(back);
}