La struttura generale di un messaggio RPC è
enum msg_type {CALL=0,REPLY=1};
struct rpc_msg {
unsigned int xid; /* numero unico di identificazione */
union switch (msg_type mtype) {
case CALL: struct call_body cbody;
case REPLY:struct reply_body rbody;
};
};
In questo esempio quindi, a seconda che il tipo di messaggio sia CALL o REPLY, il corpo del messaggio è del tipo appropriato. In ogni caso nel messaggio è sempre contenuto l’identificativo del messaggio (xid) che consente di appaiare la richiesta e la relativa risposta.
Messaggio di chiamata (CALL). Esso contiene:
identificazione dei messaggi di chiamata e risposta (campo xid)
il corpo del messaggio di chiamata strutturato
struct call_body {
/* versione protocollo RPC*/
unsigned int rpcvers;
/* identificazione unica della procedura remota*/
unsigned int prog; /* Programma */
unsigned int vers; /* Versione */
unsigned int proc; /* Procedura */
/* autenticazione del chiamante e del servitore della chiamata*/
opaque_auth cred;
opaque_auth verf;
/* da qui iniziano gli argomenti effettivi della chiamata RPC */
....argomenti....
};
Messaggio di risposta (REPLY). Esso contiene:
identificazione dei messaggi di chiamata e risposta (campo xid)
il corpo del messaggio di risposta:
enum reply_stat {MSG_ACCEPTED = 0,MSG_DENIED = 1}
union reply_body switch (reply_stat stat)
{case MSG_ACCEPTED:
struct accepted_reply areply;
case MSG_DENIED:
struct rejected_reply rreply; };
Fino al ritorno al programma cliente, il processo cliente è bloccato in attesa della risposta.
Naturalmente, più chiamate RPC possono manifestarsi in parallelo su un nodo servitore .