Home
Parametri by reference in SOAP

14 Marzo 2002

Parametri by reference in SOAP

di

In SOAP è possibile trasportare lo stack di esecuzione di una chiamata a procedura dal client al server e viceversa. Questo a volte necessita del trasporto di intere strutture dati referenziate da puntatori

Abbiamo visto nell’articolo precedente come con SOAP sia possibile passare dei parametri per valore alle procedure remote che vengono invocate dal client.
Una chiamata di funzione però coinvolge, a volte, anche parametri che vengono passati per riferimento, in questo caso SOAP prevede uno schema preciso per la gestione dei puntatori e dei riferimenti a strutture dati mappate su spazi di indirizzamento diversi, quali sono quelli di client e server.

Immaginiamo di avere un servizio remoto che riceve in input due parametri numerici e restituisce al chiamante gli stessi parametri ma con i valori scambiati.
Un servizio di questo genere è facilmente implementabile con questo codice C:

void switch_int(int *x, int *y)
{
int z = *x;
*x = *y;
*y = z;
}

/

La funzione remota, come si vede dal codice, non riceve i valori dei parametri, ma riceve in realtà dei puntatori che, nello spazio di indirizzamento del client, referenziano le zone di memoria contenenti i valori che devono essere scambiati.

Un utilizzatore client di questo servizio può essere scritto in questo modo:

main()
{
int x = 10;
int y = 20;

switch_int (&x, &y);

/*
in questo punto x = 20 e y = 10
*/
}

/

Il problema, in questo contesto, è che i puntatori che il client passa al server non hanno alcun significato nello spazio di indirizzamento di quest’ultimo, in quanto si tratta comunque di processi diversi che non hanno zone di memoria comuni.

Come può SOAP permettere che un meccanismo di questo genere funzioni?
La risposta è semplice ed è contenuta nel payload XML trasportato tra i due processi, vediamolo:

xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”>






10


20


/

Se guardiamo attentamente il payload XML ci rendiamo conto subito che il metodo attraverso il quale si risolve questo problema è piuttosto semplice, ci si porta dietro una struttura dati, ovviamente XML, che descrive fedelmente lo spazio di indirizzamento del client, in modo che questo possa essere replicato sul server.

In effetti nel payload vengono descritti i due puntatori attraverso questo frammento di codice:


/

e vengono descritte le zone di memoria cui questi puntatori fanno riferimento, ognuna con il valore reale che trasportano:


10


20

/

Il servizio che riceve questo payload ricostruisce nel suo spazio di indirizzamento la situazione che era del client, esegue l’elaborazione e spedisce al chiamante un payload in tutto e per tutto simile, vediamolo:

xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”>






20


10


/

Anche in questo caso il client sostituisce il suo vecchio spazio di indirizzamento con quello nuovo e pertanto i valori nelle locazioni di memoria indirizzate dai puntatori vengono alterati, ottenendo esattamente il risultato voluto.

Vediamo cosa accade a livello di trasporto degli stack dal client al server:

Ed una situazione analoga la troviamo nella fase di trasporto di stack tra server e client:

Come abbiamo visto con SOAP è possibile utilizzare servizi remoti passando parametri per valore e per riferimento, sarà la specifica implementazione ad occuparsi di come gestire il trasporto dei dati nel modo corretto.

L'autore

  • Massimo Canducci
    Massimo Canducci vanta oltre 25 anni di esperienza nel campo dell'innovazione e della digital transformation ed è Chief Innovation Officer per Engineering Ingegneria Informatica. È docente alla Singularity University, l'Università di Torino e l'Università di Pavia, e insegna in master MBA.

Iscriviti alla newsletter

Novità, promozioni e approfondimenti per imparare sempre qualcosa di nuovo

Gli argomenti che mi interessano:
Iscrivendomi dichiaro di aver preso visione dell’Informativa fornita ai sensi dell'art. 13 e 14 del Regolamento Europeo EU 679/2016.