<?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_%E2%80%93_Interne_Funktionsweise</id>
	<title>Rpcgen – Interne Funktionsweise - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Rpcgen_%E2%80%93_Interne_Funktionsweise"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Rpcgen_%E2%80%93_Interne_Funktionsweise&amp;action=history"/>
	<updated>2026-06-29T14:47:26Z</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_%E2%80%93_Interne_Funktionsweise&amp;diff=56&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= rpcgen – Interne Funktionsweise =  Diese Seite beschreibt die &#039;&#039;&#039;interne Arbeitsweise&#039;&#039;&#039; des Werkzeugs &#039;&#039;&#039;rpcgen&#039;&#039;&#039; und wie es auf niedriger Ebene die Kommunikation zwischen Client und Server über das Netzwerk mit Hilfe von &#039;&#039;&#039;Remote Procedure Calls (RPC)&#039;&#039;&#039; realisiert.  Sie ergänzt den Artikel rpcgen (C-Werkzeug) und erklärt insbesondere, wie rpcgen: * RPC-Code generiert, * Datenstrukturen in übertragbare Formate (XDR) wandelt, * Stub-Funktio…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Rpcgen_%E2%80%93_Interne_Funktionsweise&amp;diff=56&amp;oldid=prev"/>
		<updated>2025-10-21T12:16:27Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= rpcgen – Interne Funktionsweise =  Diese Seite beschreibt die &amp;#039;&amp;#039;&amp;#039;interne Arbeitsweise&amp;#039;&amp;#039;&amp;#039; des Werkzeugs &amp;#039;&amp;#039;&amp;#039;rpcgen&amp;#039;&amp;#039;&amp;#039; und wie es auf niedriger Ebene die Kommunikation zwischen Client und Server über das Netzwerk mit Hilfe von &amp;#039;&amp;#039;&amp;#039;Remote Procedure Calls (RPC)&amp;#039;&amp;#039;&amp;#039; realisiert.  Sie ergänzt den Artikel &lt;a href=&quot;/index.php?title=Rpcgen_(C-Werkzeug)&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Rpcgen (C-Werkzeug) (Seite nicht vorhanden)&quot;&gt;rpcgen (C-Werkzeug)&lt;/a&gt; und erklärt insbesondere, wie rpcgen: * RPC-Code generiert, * Datenstrukturen in übertragbare Formate (XDR) wandelt, * Stub-Funktio…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= rpcgen – Interne Funktionsweise =&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt die &amp;#039;&amp;#039;&amp;#039;interne Arbeitsweise&amp;#039;&amp;#039;&amp;#039; des Werkzeugs &amp;#039;&amp;#039;&amp;#039;rpcgen&amp;#039;&amp;#039;&amp;#039; und wie es auf niedriger Ebene die Kommunikation zwischen Client und Server über das Netzwerk mit Hilfe von &amp;#039;&amp;#039;&amp;#039;Remote Procedure Calls (RPC)&amp;#039;&amp;#039;&amp;#039; realisiert.&lt;br /&gt;
&lt;br /&gt;
Sie ergänzt den Artikel [[rpcgen (C-Werkzeug)]] und erklärt insbesondere, wie rpcgen:&lt;br /&gt;
* RPC-Code generiert,&lt;br /&gt;
* Datenstrukturen in übertragbare Formate (XDR) wandelt,&lt;br /&gt;
* Stub-Funktionen für Client und Server erzeugt,&lt;br /&gt;
* und wie die eigentliche Netzwerkkommunikation technisch abläuft.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Architekturüberblick ==&lt;br /&gt;
rpcgen ist ein &amp;#039;&amp;#039;&amp;#039;Code-Generator&amp;#039;&amp;#039;&amp;#039; für das ONC-RPC-System (*Open Network Computing Remote Procedure Call*), ursprünglich von Sun Microsystems entwickelt.  &lt;br /&gt;
Es setzt auf drei Schichten auf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+--------------------------+&lt;br /&gt;
|   Benutzerprogramm       |  (Client / Server Implementierung)&lt;br /&gt;
+--------------------------+&lt;br /&gt;
|   RPC-Stubs (von rpcgen) |  (Client-Stub, Server-Stub)&lt;br /&gt;
+--------------------------+&lt;br /&gt;
|   XDR &amp;amp; RPC-Laufzeit     |  (libc / libtirpc)&lt;br /&gt;
+--------------------------+&lt;br /&gt;
|   Transport (UDP/TCP)    |&lt;br /&gt;
+--------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 1. Der rpcgen-Codegenerator ==&lt;br /&gt;
rpcgen verarbeitet eine &amp;#039;&amp;#039;&amp;#039;Schnittstellenbeschreibung&amp;#039;&amp;#039;&amp;#039; (Datei *.x*) und erzeugt daraus automatisch mehrere C-Dateien:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Datei !! Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name.h&amp;lt;/code&amp;gt; || Enthält Funktionsprototypen und Konstanten (Program-, Versions- und Prozedur-IDs)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name_xdr.c&amp;lt;/code&amp;gt; || Enthält Funktionen zur XDR-Datenkonvertierung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name_clnt.c&amp;lt;/code&amp;gt; || Enthält Client-Stubs für RPC-Aufrufe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name_svc.c&amp;lt;/code&amp;gt; || Enthält Server-Stubs, die eingehende RPCs verarbeiten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 2. XDR – External Data Representation ==&lt;br /&gt;
RPC verwendet das &amp;#039;&amp;#039;&amp;#039;XDR-Format&amp;#039;&amp;#039;&amp;#039; (External Data Representation), um Daten plattformunabhängig zu übertragen.&lt;br /&gt;
&lt;br /&gt;
Jede Struktur, die in der .x-Datei definiert ist, erhält automatisch eine passende XDR-Funktion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
bool_t xdr_structname(XDR* xdrs, struct structname* objp);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Funktion arbeitet je nach Modus:&lt;br /&gt;
* **ENCODE** – Daten werden in Netzwerkformat serialisiert&lt;br /&gt;
* **DECODE** – Daten werden aus Netzwerkformat deserialisiert&lt;br /&gt;
&lt;br /&gt;
Beispiel:&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;
    return xdr_int(xdrs, &amp;amp;objp-&amp;gt;a) &amp;amp;&amp;amp;&lt;br /&gt;
           xdr_int(xdrs, &amp;amp;objp-&amp;gt;b);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit können Systeme mit unterschiedlicher Endianness (Little/Big Endian) sicher kommunizieren.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 3. Die generierten Stubs ==&lt;br /&gt;
rpcgen erzeugt zwei Stub-Schichten:&lt;br /&gt;
&lt;br /&gt;
=== Client-Stubs (name_clnt.c) ===&lt;br /&gt;
Diese Funktionen sehen für den Programmierer wie lokale Funktionsaufrufe aus, führen intern aber eine Netzwerkübertragung aus.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int *add_1(intpair *argp, CLIENT *clnt) {&lt;br /&gt;
    static int res;&lt;br /&gt;
    memset(&amp;amp;res, 0, sizeof(res));&lt;br /&gt;
&lt;br /&gt;
    if (clnt_call(clnt, ADD,&lt;br /&gt;
                  (xdrproc_t)xdr_intpair, (caddr_t)argp,&lt;br /&gt;
                  (xdrproc_t)xdr_int, (caddr_t)&amp;amp;res,&lt;br /&gt;
                  TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
        return NULL;&lt;br /&gt;
    }&lt;br /&gt;
    return &amp;amp;res;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ruft &amp;lt;code&amp;gt;clnt_call()&amp;lt;/code&amp;gt; die RPC-Laufzeitfunktion aus der Bibliothek &amp;lt;code&amp;gt;libtirpc&amp;lt;/code&amp;gt; auf, die:&lt;br /&gt;
1. die Daten per XDR kodiert,&lt;br /&gt;
2. über UDP oder TCP an den Server sendet,&lt;br /&gt;
3. auf die Antwort wartet,&lt;br /&gt;
4. das Ergebnis dekodiert und zurückgibt.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Server-Stubs (name_svc.c) ===&lt;br /&gt;
Diese Funktionen verarbeiten eingehende RPC-Anfragen. Sie werden automatisch von der Funktion &amp;lt;code&amp;gt;svc_run()&amp;lt;/code&amp;gt; aufgerufen, sobald ein Client eine RPC-Anfrage sendet.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
static void calcprog_1(struct svc_req *rqstp, SVCXPRT *transp) {&lt;br /&gt;
    union {&lt;br /&gt;
        intpair add_1_arg;&lt;br /&gt;
    } argument;&lt;br /&gt;
    int result;&lt;br /&gt;
    bool_t retval = FALSE;&lt;br /&gt;
&lt;br /&gt;
    memset(&amp;amp;argument, 0, sizeof(argument));&lt;br /&gt;
    if (!svc_getargs(transp, (xdrproc_t)xdr_intpair, (caddr_t)&amp;amp;argument)) {&lt;br /&gt;
        svcerr_decode(transp);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    result = *add_1_svc(&amp;amp;argument, rqstp);&lt;br /&gt;
    svc_sendreply(transp, (xdrproc_t)xdr_int, (char*)&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;
== 4. Ablauf einer RPC-Kommunikation ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Client                         Server&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
| add_1(&amp;amp;p)                  |                          |&lt;br /&gt;
|   → clnt_call()            |                          |&lt;br /&gt;
|       → send via UDP/TCP   |                          |&lt;br /&gt;
|                            | svc_run() empfängt       |&lt;br /&gt;
|                            | → svc_getargs()          |&lt;br /&gt;
|                            | → add_1_svc()            |&lt;br /&gt;
|                            | → svc_sendreply()        |&lt;br /&gt;
|   ← Ergebnis empfangen     |                          |&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Kurz gesagt:**&lt;br /&gt;
- Der Client ruft eine Stub-Funktion auf.&lt;br /&gt;
- Der Stub serialisiert Argumente und sendet sie an den Server.&lt;br /&gt;
- Der Server-Stub empfängt, dekodiert, ruft die echte Funktion auf und schickt das Ergebnis zurück.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 5. Transport und Protokolle ==&lt;br /&gt;
rpcgen unterstützt mehrere Transportarten:&lt;br /&gt;
* **UDP** – schnell, verbindungslos, nicht zuverlässig&lt;br /&gt;
* **TCP** – zuverlässig, verbindungsorientiert&lt;br /&gt;
* **RAW** – intern für Tests&lt;br /&gt;
&lt;br /&gt;
Die Bibliothek `libtirpc` (oder ältere `libc`-Implementierungen) übernimmt den Netzwerkcode vollständig.  &lt;br /&gt;
Beispiel:  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
CLIENT *clnt = clnt_create(&amp;quot;localhost&amp;quot;, CALCPROG, CALCVERS, &amp;quot;tcp&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 6. Der Portmapper ==&lt;br /&gt;
Damit Client und Server einander finden, nutzt ONC-RPC den &amp;#039;&amp;#039;&amp;#039;Portmapper-Dienst&amp;#039;&amp;#039;&amp;#039; (Programmnummer 100000, Port 111).  &lt;br /&gt;
Der Server registriert sich beim Portmapper:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
svc_register(transp, CALCPROG, CALCVERS, calcprog_1, IPPROTO_TCP);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Client fragt beim Portmapper den tatsächlichen Port für das Programm &amp;lt;code&amp;gt;CALCPROG&amp;lt;/code&amp;gt; ab.  &lt;br /&gt;
Dadurch kann RPC auch dynamische Ports verwenden.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 7. Lebenszyklus eines rpcgen-Projekts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. .x-Datei definieren (Datentypen &amp;amp; Prozeduren)&lt;br /&gt;
2. rpcgen aufrufen → erzeugt Code&lt;br /&gt;
3. Server-Implementierung schreiben (z. B. *_svc.c erweitern)&lt;br /&gt;
4. Client-Programm schreiben&lt;br /&gt;
5. Beide kompilieren und starten&lt;br /&gt;
6. Client ruft Funktionen auf → RPC läuft automatisch über Netzwerk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 8. Fehlerbehandlung und Rückgabecodes ==&lt;br /&gt;
RPC-Funktionen geben in der Regel über &amp;lt;code&amp;gt;enum clnt_stat&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;enum auth_stat&amp;lt;/code&amp;gt; Fehler zurück, z. B.:&lt;br /&gt;
* &amp;lt;code&amp;gt;RPC_SUCCESS&amp;lt;/code&amp;gt; – Erfolg  &lt;br /&gt;
* &amp;lt;code&amp;gt;RPC_TIMEDOUT&amp;lt;/code&amp;gt; – Timeout  &lt;br /&gt;
* &amp;lt;code&amp;gt;RPC_AUTHERROR&amp;lt;/code&amp;gt; – Authentifizierungsfehler  &lt;br /&gt;
* &amp;lt;code&amp;gt;RPC_CANTSEND&amp;lt;/code&amp;gt; – Senden fehlgeschlagen&lt;br /&gt;
&lt;br /&gt;
Fehlerausgabe erfolgt meist über:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
clnt_perror(clnt, &amp;quot;Fehler bei RPC&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== 9. Vergleich mit modernen Technologien ==&lt;br /&gt;
| Technologie | Beschreibung |&lt;br /&gt;
|--------------|--------------|&lt;br /&gt;
| **ONC RPC (rpcgen)** | Klassisches C-basiertes RPC-System |&lt;br /&gt;
| **gRPC (Google RPC)** | Moderne, Protobuf-basierte Variante mit HTTP/2 |&lt;br /&gt;
| **XML-RPC / JSON-RPC** | Textbasierte, plattformunabhängige Alternativen |&lt;br /&gt;
| **D-Bus** | IPC für Linux-Desktop-Systeme |&lt;br /&gt;
&lt;br /&gt;
rpcgen ist sehr performant, aber weniger flexibel für heterogene oder moderne Webumgebungen.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[rpcgen (C-Werkzeug)]]&lt;br /&gt;
* [[XDR (External Data Representation)]]&lt;br /&gt;
* [[Marshalling (Informatik)]]&lt;br /&gt;
* [[Stub (Softwareentwicklung)]]&lt;br /&gt;
* [[Portmapper (RPC)]]&lt;br /&gt;
* [[Verteilte Systeme]]&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;
* Stevens, W. Richard: &amp;#039;&amp;#039;UNIX Network Programming, Vol. 1&amp;#039;&amp;#039;, Prentice Hall.  &lt;br /&gt;
* Linux Manual: &amp;lt;code&amp;gt;man rpcgen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;man 3 rpc&amp;lt;/code&amp;gt;  &lt;br /&gt;
* RFC 5531 – Open Network Computing (ONC) Remote Procedure Call (RPC)&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>