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=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[]).