Po pierwsze, jeżeli przesyłasz dane pomiędzy różnymi komputerami nie wiesz jakie wielkości będą miały poszczególne typy. Zazwyczaj int i short będą miały takie rozmiary jak się spodziewasz, ale na innych architekturach short i int mogą mieć po 16 bitów.
Po drugie, na różnych architekturach liczby kodowane są w różny sposób (pomijam raczej całkowicie teoretyczne rozważania, iż zmienne ze znakiem nie muszą być kodowane w U2) -- konkretnie chodzi o kolejność bajtów. Na jednym komputerze wartość 0x1234 może być zapisana w pamięci jako 0x12, 0x23, a na innym 0x23, 0x12.
Reasumując, aby przesyłać struktury, należy je ręcznie pakować do bufora, np.:
Kod: Zaznacz cały
struct foo {
int a;
short b;
int c;
};
static void put16(unsigned char *buf, short val) {
buf[0] = (val >> 8) & 0xff;
buf[1] = val & 0xff;
}
static void put32(unsigned char *buf, int val) {
put16(buf, (val >> 16) & 0xffff);
put16(buf + 2, val & 0xffff);
}
static short get16(unsigned char *buf) {
return ((buf[0] & 0xff) << 8) | (buf[1] & 0xff);
}
static int get32(unsigned char *buf) {
return (get16(buf) << 16) | get16(buf + 2);
}
/* Wysyalnie */
{
struct foo foo;
unsigned char buf[10];
put32(buf , foo.a);
put16(buf + 4, foo.b);
put32(buf + 6, foo.c);
send(fd, buf, 10, 0);
}
/* Odbieranie */
{
struct foo foo;
unsigned char buf[10];
recv(fd, buf, 10, 0);
foo.a = get32(buf );
foo.b = get16(buf + 4);
foo.c = get32(buf + 6);
}
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘
mina86’ in response to the previous one.