<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Rpcgen</id>
	<title>Rpcgen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Rpcgen"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Rpcgen&amp;action=history"/>
	<updated>2026-08-25T02:43:24Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Rpcgen&amp;diff=54&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= rpcgen (C-Werkzeug) =  Das Programm &#039;&#039;&#039;rpcgen&#039;&#039;&#039; (*Remote Procedure Call Generator*) ist ein Hilfswerkzeug der C-Programmierumgebung, das Quellcode für die Implementierung von &#039;&#039;&#039;Remote Procedure Calls (RPC)&#039;&#039;&#039; 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 == &#039;&#039;&#039;rpcgen&#039;&#039;&#039; automatisiert die Erstellung der not…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Rpcgen&amp;diff=54&amp;oldid=prev"/>
		<updated>2025-10-21T12:13:59Z</updated>

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