Know-how: Kommunikation mit Remote Procedure Calls

RPC-Beispiel

Als Beispiel soll ein Server für Anfragen nach Telefonnummern realisiert werden. Im ersten Schritt der RPC-Entwicklung muss der Programmierer einen eindeutigen Bezeichner für das so genannte Interface erzeugen. Dazu steht das Programm uuidgen zur Verfügung. Eventuell ist zunächst ein Aufruf von vcvars32.bat nötig, damit die Suchpfade entsprechend gesetzt sind. Der Aufruf

uuidgen /i /otelbu.idl

erzeugt dann eine Datei mit einem eindeutigen Identifikator (Universally Unique IDentifier, UUID). Im Beispiel resultierte daraus die Datei telbu.idl mit folgendem Inhalt:

//file telbu.idl
[
uuid(49db6843-b369-4551-86f6-b3254a9b8a1a),
version(1.0)
]
interface INTERFACENAME
{

}

In diese IDL-Datei (IDL: Interface Definition Language) trägt man als Nächstes einen Namen für das Interface sowie die vorgesehenen Prozeduren ein. Das Interface bekommt den Namen telbu als Abkürzung von Telefonbuch. Zunächst ist nur eine einzige Prozedur testKomm als Test für die Kommunikation vorgesehen. Diese Prozedur erhält als Argument eine Zeichenkette, die dann als Bestätigung für eine geglückte Übertragung auf der Seite des Servers ausgegeben wird. Damit erhält man:

//file telbu.idl
[
uuid(49db6843-b369-4551-86f6-b3254a9b8a1a),
version(1.0)
]
interface telbu
{
void testKomm([in, string] unsigned char * testString);
}

In der Deklaration sind zusätzliche Attribute für den Parameter eingetragen. Die Angabe "in" legt fest, dass es sich um einen Eingabewert handelt, den die Prozedur nicht überschreiben darf. Das zweite Attribut string deklariert den Parameter als eine gemäß der C-Konvention mit '\\0' abgeschlossene Zeichenkette. Damit kann der Compiler die Funktion strlen einsetzen, um die Länge des zu übertragenden Datenbereichs zu bestimmen. Weiterhin benötigt man ein so genanntes Application Configuration File (ACF).

//file: telbu.acf
[implicit_handle (handle_t telbu_IfHandle)
] interface telbu
{
}

Aus diesen beiden Dateien erzeugt der MIDL-Compiler (MIDL steht für Microsoft IDL) mit dem Aufruf midl telbu.idl den C-Code für den Server- und Client-Stub. Die beiden Dateien erhalten die Namen telbu_s.c und telbu_c.c. Weiterhin legt er eine Header-Datei telbu.h an.