Michael Ott <[EMAIL PROTECTED]> writes:

> Hallo Bruno!
>
>> > Ich lese gerade mittels socket eine Struct, das sich nicht an die
>> > 32bit-Grenze nicht h�lt. 
>> >
>> > Ich habe folgendes Strukt:
>> > struct {
>> >    char[10];
>> >    int;
>> > }
>> > und genau das bekomme ich �ber das Netz, nur das er mir wirklich 10bit
>> > und danach die Zahl bringt,
>> 
>> 10 Byte wahrscheinlich. Und wo ist das Problem? Du sagst es wird alles
>> �bertragen, erst 10 und dann nochmal 4 Byte. Da sehe ich weit und
>> breit kein Problem, und wenn da eines w�re hat es mit einer wie immer
>> gearteten 32bit Grenze vermutlich gar nichts zu tun.
>> 
>> Weisst du nicht wie du die 14 Byte korrekt lesen sollst, oder wo
>> hapert es? Mit etwas Quellcode lie�e sich nebenbei vielleicht mehr
>> sagen.
> gcc schreibt aber intern das int nicht gleich hinter die chars, sondern
> f�ngt an der n�chsten 32bit-Grenze an. Und dabei liegt das Problem. Die
> Daten aus dem Socket sind aber hintereinander weg geschrieben.
>
> Ich habe mir die Speicheraddressen ausgegeben und da f�ngt das int vom
> Socket zwei Bytes vor dem dem int aus der Struktur an.
>
> Ich habe dabei die Bytes mir einzeln ausgelesen

Ah, OK. Du deklarierst ein analoges struct auf der receiver Seite und
da passt es nicht mehr. Das Schlagwort hier hei�t 'struct padding'.

Zwei Alternativen:

struct {
        char[10];
        int;
} __atribute__((packed));

oder du stellst das int einfach an den Anfang, nat�rlich auf sender
und receiver Seite

struct {
        int;
        char[10];
}

Generell, und insbesondere wenn bin�re Daten �ber's Netzwerk gehen
sollen, empfiehlt es sich in structs die 'dicken Teile' an den Anfang
zu stellen, d.h. zumindest die Teile, die auf alignment boundaries
fallen.

Gruss, Bruno.

Antwort per Email an