Newsgroup: it.comp.lang.c++
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;


e perche' nn dovrebbe?

 e perche' nn dovrebbe?
Questo argomento e' OT. Ricordati pero' i problemi di struct alignment e di
endianess....
Tommy



Lecito, ma non portabile. Cambiando l'architettura di macchina, o
anche solo il compilatore, o anche solo le opzioni di compilazione, si
possono ottenere risultati diversi.
Se vuoi fare della comunicazione tra processi usando un protocollo
definito da te, cioe' non well-known, ti consiglio di usare RPC (=
Remote Procedure Call) oppure CORBA.
-- 
	Carlo Milanesi
 
http://digilander.libero.it/carlmila

Mi avevano detto che non č possibile.
struct alignment?
scusate per l'OT

 struct alignment?
basterebbe google...
Ad esempio sul se *IO* compilo un programma con la seguente struttura:
struct SProva{
    char a;
    int b;
    char c[3];
    int d;
};
ottengo sizeof(SProva) uguale a 16 bytes invece che 12 come ci si potrebbe
aspettare.
Ecco cosa combina il mio compilatore:
AAAAAAAA ######## ######## ########
BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBB
CCCCCCCC CCCCCCCC CCCCCCCC ########
DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD
Come vedi "char a" occupa un solo byte eppure il compilatore ne inserisce
altri tre per allineare meglio il secondo intero b che occupa 4 bytes.
"char c[3]" occupa 3 bytes eppure un altro byte viene usato per lo stesso
motivo.
AAAAAAAA constraddistingue i byte usati dalla variabile a, BBB... quelli da
b etc...
######## contraddistingue invece quelli in piu', di allineamento!
Questi bytes in piu' servono per allineare i bytes in file da quattro bytes
ognuno (detto in parole estremamente povere!).
Ora, mi basta andare nelle opzioni di compilazione e dire che non voglio
struct alignment e.... ottengo:
AAAAAAAA
BBBBBBBB
BBBBBBBB
BBBBBBBB
BBBBBBBB
CCCCCCCC
CCCCCCCC
CCCCCCCC
DDDDDDDD
DDDDDDDD
DDDDDDDD
DDDDDDDD
Mi basta andare nelle opzioni e dire che voglio un allineamento diverso (due
a due) ed ottengo:
AAAAAAAA ########
BBBBBBBB BBBBBBBB
BBBBBBBB BBBBBBBB
CCCCCCCC CCCCCCCC
CCCCCCCC ########
DDDDDDDD DDDDDDDD
DDDDDDDD DDDDDDDD
Bene, fare affidamento sullo struct alignment non e' consigliato.
Ad esempio il mio compilatore di default produce:
AAAAAAAA ######## ######## ########
BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBB
CCCCCCCC CCCCCCCC CCCCCCCC ########
DDDDDDDD DDDDDDDD DDDDDDDD DDDDDDDD
il tuo potrebbe produrre qualche cosa di diverso! Quindi i due programmi non
possono scambiarsi le strutture altrimenti si ottengono risultati
imprevedibili! Ad esempio il secondo byte qui sopra e' spazzatura mentre
senza padding (secondo esempio) corrisponde al primo byte di b.
Lo struct alignment viene generalmente fatto per motivi di prestazione... ma
come ti ho fatto vedere puo' creare problemi di comunicazione. Inoltre
spedire tramite internet strutture con padding significa spedire bytes in
piu' che non sono necessari....
Conta che oltre al discorso C/C++ il tuo programma dovrebbe essere in grado
di comunicare con programmi scritti anche in altri linguaggi, ad esempio in
Visual Basic, Delphi, Perl etc... Inoltre un macchina DOS a 16 con un
programma scritto in C potrebbe voler comunicare con una macchina AMD64 bits
sotto windows con un programma scritto in Visual Basic.NET.
Per questi motivi converrebbe non spedire direttamente strutture in formato
binario ma scrivere invece i dati (tutti i campi di una struttura) in un
buffer di bytes e poi spedire il buffer.
In fine ho paralto di endianess, anche quello e' un concetto fondamentale
per non avere altri risultati imprevedibili!
Il buffer di cui parlavo deve tenere conto anche di endianess con htonl() e
funzioni varie.
Concludo dicendo che ho affrontato tutti i discorsi in modo superficiale ed
approsimativo in quanto lunghi e poi OT su questo NG. Per maggiori dettagli
rivolgiti ad un NG specifico.
Tommy

Ti ringrazio tantissimo, anche degli aiuti "superficiali" posso bastare, in
questo modo posso imboccare la strada giusta, poi faccio da solo. Ancora
grazie