22) Quali primitive consentono il trattamento messaggi in modo scatter/gather?

Le primitive writev e readv permettono lo scatter/gather, ovvero la scrittura/lettura da buffer non contigui. Ciò consente (anzi, è richiesto dalle primitive) l’incapsulamento delle informazioni a livello applicativo, senza delegarlo a livello di trasporto.

rit=writev(s,iov,iovcount);

rit=readv(s,iov,iovcount);

int rit,s,iovcount;

struct iovec iov[];

struct iovec {

caddr_t iov_base; /*indirizzo base di un buffer*/

int iov_len;} /*dimensione del buffer*/

Parametri:

rit ritorna il numero di bytes scritti o letti in caso di successo e -1 in caso di errore

s è il socket descriptor

iov è il puntatore al primo dei buffer di tipo ioved

iovcount è il numero dei buffer

Anche le primitive recvmsg e sendmsg permettono lo scatter/gather:

rit=recvmsg(s,msg,flags);

rit=sendmsg(s,msg,flags);

int rit,s,flags;

struct msghdr *msg[];

struct msghdr {

caddr_t msg_name; /*indirizzo socket remota-opz. se connessa*/

u_int msg_namelen; /*dimensione indirizzo*/

struct iovec *msg_iov; /*scatter/gather array*/

u_int msg_iovlen; /*numero elementi in msg_iov*/

caddr_t msg_control; /* dati vari relativi al protocollo*/

u_int msg_controllen /* lunghezza dati vari */

int msg_flags;} /* flags relativi al messaggio ricevuto*/

Parametri:

rit ritorna il numero di bytes scritti o letti in caso di successo e -1 in caso di errore

s è il socket descriptor

msg è il puntatore alla struttura di tipo msghdr

flags può assumere diversi valori in relazione a come si vuole configurare la comunicazione

L’esito delle chiamate è di scrivere o leggere i buffer iov[0], iov[1], ecc. uno per volta fino al termine in maniera sequenziale ed atomica (idem per msg[]).

 


Back
Index
Next