Newsgroup: it.comp.programmare
Titolo: send di una struct

E' possibile effettuare una send di questo tipo:
send(socket, (void *)&pacchetto, sizeof(pacchetto), 0 );
con pacchetto uguale a:
typedef struct type_pacchetto {
        char userName[30];                        /* nome mittente */
        char fileName[30];                         /* nome file */
        char opzioniCompilazione[150];    /* opzioni di compilazione */
        unsigned long int crc;                      /* CRC */
        unsigned long int lunghezzaFile;     /* lunghezza del file */
} type_pacchetto;

Nuke wrote:

si potresti se il tutto rimane in send e lettura sulla tua stessa 
macchina/configurazione e stesso eseguibile, seno' avresti problemi :
a) di allineamento della struttura
b) di endiannes
c) altro non mi viene in mente ora ...
li risolvi con:
a) usando preprocessori particolari del tuo compilatore che generano strutture 
packed ( se vuoi essere portabile molto ma molto sconsigliabile )
a bis) rimappando ad uno ad uno i dati della struttura in un buffer di char ( 
100% portabile ma abbastanza costoso come performance, soprattutto se si 
vogliono ottenere prestazioni sublimi )
b) usando le varie htonl() htons() ntohl() ntohs () ( purtroppo se usi formati 
maggiori del 32bit ti devi scrivere da te le funzioni di conversione ... nulla 
di preoccupante ma ti porta a fare un buono studio soprattutto se ti servono 
molto prestanti ... )
c) spero che se altri sul ng hanno da aggiungere qualcosa lo facciano.
ciao

Potresti spiegarmi meglio la a? Per l'endian il problema non c'č. Intanto ti
ringrazio

 ringrazio
la parte della a) dove ti hanno spiegato come fare con il buffer lo hai gia' 
letto sul NG i.c.l.c o c++ se non sbaglio ... dal post di tommy che ti spiegava 
l'allineamento dei campi di una struct ...
invece quello che ti dicevo io ... se tu sai bene quali compilatori userai per 
compilare il tuo codice, e' facile cercare sul suo manuale delle specifiche di 
preprocessore, o parole chiave apposta per non far allineare la struttura cosi' 
da averla tutta completamente contigua.
il problema e' che usando questo modo guadagni si in prestazioni sull tuo 
sistema architettura/compilatore, ma diventi non portabile su altri compilatori 
o architetture.
esempio ... scrivi il tuo programma su VS.net(7.1) e lo compili e lo usi solo su 
x86, un domani ti serve portarlo su sparc compilandolo con il gcc ed ecco che le 
tue definizioni della struttura non funzionano piu' ... e devi 1) cercare magari 
il comando che usa il gcc per tenere contigua una struttura, ed in piu' molto 
probabilmente dovrai scriverti tutta la parte di spostamento dei dati in un 
buffer per fare la send perche' sparc e' una di quelle macchine che forza ad 
allineare a 4byte gli int, e quindi solo se hai molta ma molta fortuna riuscirai 
ad allineare senza problemi la struttura.
spero di averti spiegato tutto ...
ciao

OK, capito tutto. La prima versione di questo SW puň andare bene cosě, piů
avanti dovrň fare alcune modifiche ed eliminerň la struttura. Ti ringrazio
per l'aiuto. Ciao

Per l'endian il problema non c'č.
   Dicevo cosi` anche io, poi passai una nottata a scrivere `htons'
qua e la`, e da allora ci penso in anticipo. :)
-- 
S.L.

Non c'è nel senso che ho già piazzato vari htonl dove servivano. ;-)