Rpcgen
rpcgen (C-Werkzeug)
Das Programm rpcgen (*Remote Procedure Call Generator*) ist ein Hilfswerkzeug der C-Programmierumgebung, das Quellcode für die Implementierung von Remote Procedure Calls (RPC) automatisch erzeugt. Es ist Teil des SunRPC-Systems (heute als ONC RPC bekannt) und wird auf UNIX- und Linux-Systemen häufig zur Entwicklung verteilter Anwendungen verwendet.
---
Zweck
rpcgen automatisiert die Erstellung der notwendigen Client- und Server-Kommunikationsroutinen für verteilte Programme. Statt alle Netzwerkfunktionen (z. B. Socket-Erstellung, Serialisierung, Übertragung) manuell zu implementieren, kann der Entwickler nur die Funktionsschnittstellen in einer speziellen Beschreibungssprache (*.x*-Datei) definieren – den Rest erledigt rpcgen.
Beispielhafter Ablauf:
.x-Datei → rpcgen → generierter C-Code → Kompilierung zu Client & Server
---
Funktionsweise
Der Entwickler beschreibt die zu übertragenden Datentypen und Prozeduren in einer RPC-Interface-Definition-Datei mit der Endung .x.
Diese Datei wird anschließend von rpcgen verarbeitet, um automatisch:
- Header-Dateien (.h)
- Client-Stubs (.c)
- Server-Stubs (.c)
- Serialisierungsfunktionen (XDR-Code)
zu erzeugen.
---
Aufruf
rpcgen [Optionen] datei.x
- Wichtige Optionen:**
| Option | Beschreibung |
|---|---|
-C |
Erzeugt ANSI-C-kompatiblen Code (Standard bei modernen Systemen) |
-a |
Erzeugt alle notwendigen Dateien (Client, Server, Header, Makefile) |
-c |
Erzeugt nur die XDR-Konvertierungsfunktionen |
-h |
Erzeugt nur die Header-Datei |
-l |
Erzeugt nur die Server-Seiten-Stubs |
-m |
Erzeugt nur das Hauptprogramm des Servers |
-t |
Erzeugt nur die Client-Seiten-Stubs |
-M |
Verhindert Mehrfachdefinitionen bei mehreren rpcgen-Durchläufen
|
---
Beispiel: RPC-Definition
Beispielhafte Datei calc.x für einen einfachen RPC-Rechnerdienst:
/* calc.x – Beispiel für rpcgen */
program CALCPROG {
version CALCVERS {
int ADD(intpair) = 1;
int SUB(intpair) = 2;
} = 1;
} = 0x20000001;
struct intpair {
int a;
int b;
};
---
Generierung
Mit dem Befehl:
rpcgen -a calc.x
werden folgende Dateien erzeugt:
| Datei | Zweck |
|---|---|
calc.h |
Enthält Konstanten, Datentypdefinitionen und Funktionsprototypen |
calc_clnt.c |
Client-seitige Stub-Funktionen |
calc_svc.c |
Server-seitige Stub-Funktionen |
calc_xdr.c |
Funktionen zur Serialisierung (XDR) |
calc_client.c |
Beispielclient (wenn -a verwendet wird) |
calc_server.c |
Beispielserver (wenn -a verwendet wird) |
Makefile.calc |
Beispiel-Makefile zum Kompilieren |
---
Beispiel: Client- und Serverprogramm
Server (Auszug aus calc_server.c)
#include "calc.h"
int *add_1_svc(intpair *pair, struct svc_req *req) {
static int result;
result = pair->a + pair->b;
return &result;
}
int *sub_1_svc(intpair *pair, struct svc_req *req) {
static int result;
result = pair->a - pair->b;
return &result;
}
---
Client (Auszug aus calc_client.c)
#include "calc.h"
#include <stdio.h>
int main(int argc, char *argv[]) {
CLIENT *clnt;
intpair p;
int *result;
if (argc != 4) {
printf("Verwendung: %s host zahl1 zahl2\n", argv[0]);
exit(1);
}
clnt = clnt_create(argv[1], CALCPROG, CALCVERS, "udp");
if (clnt == NULL) {
clnt_pcreateerror(argv[1]);
exit(1);
}
p.a = atoi(argv[2]);
p.b = atoi(argv[3]);
result = add_1(&p, clnt);
if (result == NULL)
clnt_perror(clnt, "Fehler bei RPC");
else
printf("Ergebnis: %d\n", *result);
clnt_destroy(clnt);
return 0;
}
---
XDR (External Data Representation)
rpcgen erzeugt automatisch Funktionen zur Umwandlung der Datenstrukturen in ein plattformunabhängiges Format (XDR), um die Kommunikation zwischen unterschiedlichen Systemarchitekturen zu ermöglichen.
Beispiel aus calc_xdr.c:
bool_t xdr_intpair(XDR *xdrs, intpair *objp) {
if (!xdr_int(xdrs, &objp->a)) return FALSE;
if (!xdr_int(xdrs, &objp->b)) return FALSE;
return TRUE;
}
---
Ablauf eines RPC-Aufrufs
Client Server | | | Anfrage ---> | | <--- Antwort |
Der Client ruft die generierte Stub-Funktion (z. B. add_1()) auf, die über das Netzwerk die Anfrage an den Server sendet.
Der Server empfängt die Anfrage, ruft die Implementierung (z. B. add_1_svc()) auf und sendet das Ergebnis zurück.
---
Vorteile
- Automatische Codegenerierung für RPC-Kommunikation
- Plattformunabhängige Datenübertragung (XDR)
- Vereinfachte Entwicklung verteilter Systeme
- Trennung von Schnittstelle und Implementierung
Nachteile
- Abhängigkeit von der RPC-Laufzeitumgebung
- Komplexer bei Firewalls/NAT
- Weniger verbreitet in modernen Netzwerken (ersetzt durch gRPC, REST, etc.)
---
Siehe auch
- Remote Procedure Call (RPC)
- XDR (External Data Representation)
- Stub (Softwareentwicklung)
- Marshalling (Informatik)
- Verteilte Systeme
- getaddrinfo (C-Funktion)
---
Quellen
- Sun Microsystems: rpcgen User’s Guide
- ISO/IEC 9899:2018 (C18) – Programming Language C
- Stevens, W. Richard: UNIX Network Programming, Vol. 1, Prentice Hall.
- Linux man page:
man rpcgen - GNU C Library Documentation