17) Come chiama il client la procedura remota sul server?
Una volta che il client ha creato il gestore di trasporto si raggiunge un'entità del tipo {n_prog, n_vers, protocollo} tramite il numero di porta relativo. La procedura di dispatching è già selezionata, e la clnt_call() specifica solo il gestore di trasporto e l’identificazione della procedura.
La struttura della clnt_call è:
enum clnt_stat clnt_call(clnt, procnum,inproc,in,outproc,out,tout)
CLIENT *clnt; /*gestore di trasporto locale, ottenuto con una clntXXX_create*/
u_long procnum; /*identificazione(numero)procedura remota*/
xdrproc_t inproc; /* routine XDR */
char *in; /*argomenti della procedura*/
xdrproc_t outproc; /* routine XDR */
char *out; /*risultato*/
struct timeval tout; /*valore del timeout per l’attesa risposta*/
per quanto riguarda il valore del timeout:
Analisi degli eventuali errori: il risultato di clnt_call() è analizzato con clnt_perror(), che stampa sullo standard error una stringa contenente un messaggio di errore:
void clnt_perror(clnt,s)
CLIENT * clnt; /*gestore di trasporto*/
char * s; /*stringa di output*/
Distruzione del gestore di trasporto del client: la primitiva clnt_destroy() dealloca lo spazio associato al gestore CLIENT, senza chiudere la socket, quindi ne consegue che più gestori possono condividere una stessa socket:
void clnt_destroy (clnt)
CLIENT *clnt;