Rpcgen

Aus dev.kaibel.net
Zur Navigation springen Zur Suche springen

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

---

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