[so] Case study - Optiunea -fpack-struct
Lucian Adrian Grijincu
lucian.grijincu at gmail.com
Sun Dec 9 22:25:49 EET 2007
On Dec 9, 2007 9:17 PM, Stefan Bucur <stefan.bucur at gmail.com> wrote:
> Salut!
>
Salut Stefan,
> Intrucat am pierdut o groaza de vreme cu problema asta, consider ca
> merita s-o postez si pe lista de discutii, pentru ca altii sa invete
> din greselile mele si sa le evite pe viitor.
[snip]
> Intrucat protocolul meu de comunicare dintre client si server pentru
> tema 4 se bazeaza pe structuri C, am zis ca ar fi bine sa eficientizez
> cantitatea de date transmisa si sa comprim structurile in memorie.
> Pentru asta, stiam ca exista optiunea de compilare -fpack-struct, care
> facea fix ce voiam eu pentru toate structurile, fara sa fiu nevoit sa
> adaug __attribute__((__packed__)) pentru fiecare structura de-a mea in
> parte.
>
[snip]
> gasit un bug in functia stat() [ you may laugh at this point :P ], asa
we laugh we did :)
Nu e o idee buna sa trimiti structuri pe socket.
Recipientul s-ar putea sa nu fie compilat cu aceleasi flaguri, si daca
e compilat cu aceleasi flaguri s-ar putea sa aiba alte dimensiuni
pentru tipurile de date din structura.
de ex. esti pe un sistem x64 si ai doua binare, unul de 32 de biti si
unul de 64 de biti. Ambele compilate cu aceleasi flaguri s-ar putea sa
aiba dimensiuni diferite pentru int, long etc.
definind _FILE_OFFSET_BITS=32 sau _FILE_OFFSET_BITS=64 anumite tipuri
de date (ino_t, off_t ș.a.) pot avea 32, respectiv 64 de biți.
Daca masina pe care asculta recipientul are o alta arhitectura e
posibil ca endiannessul sa fie diferit (si poate si dimensiunile).
Aceleasi flaguri pot avea comportamente diferite pe versiuni diferite
de gcc, etc. you should get the point by now. DON'T DO IT!!!11ONE
In schimb fa o functie de serializare/deserializare a structurii, care
trimite in o ordine data (pe care o specifici in mod explicit in
protocol) si una de deserializare.
In protocol iti specifici in mod explicit: endianness, dimensiune
campuri, ordine campuri.
E mai usor ca doua programe sa suporte acelasi protocol daca au
control explicit asupra a ceea ce se transmite decat atunci cand
datele depind de factori care nu pot fi controlati.
--
Lucian
More information about the so
mailing list