Senden Sie eine Struktur über Sockets in C
Ich entwickle eine client/server-Programm, und mein client zum senden von Nachrichten an den server.
Beispiel-Nachricht C-Struktur:
struct Registration
{
char multicastGroup[24];
pid_t clientPid;
};
Client-code-snippet zu serialisieren struct
struct Registration regn ;
regn.clientPid = getpid();
strcpy(regn.multicastGroup, "226.1.1.1");
printf("PID:%d\n", regn.clientPid);
printf("MG:%s\n", regn.multicastGroup);
printf("Size:%d\n", sizeof(regn)); //Size is 28
data = (unsigned char*)malloc(sizeof(regn));
memcpy(data, ®n, sizeof(regn));
printf("Size:%d\n", sizeof(data)); //Size is 4.
Server-code zu de-serialisieren Daten
if(recvfrom(sd, recvBuf, recvBufSize, 0, (struct sockaddr*)&clientAddr, &len) < 0)
{
printf("Error receiving message from client\n");
}
else
{
printf("Message received:%s\n", recvBuf);
printf("Size :%d\n", strlen(recvBuf));
memcpy(®n, recvBuf, sizeof(regn));
printf("PID:%d\n", regn.clientPid);
printf("MG:%s\n", regn.multicastGroup);
}
Nach dem kopieren der Struktur zu unsigned char *
die Größe des Arrays ist nur 4.
Warum werden die Daten nicht vollständig kopiert, das array?
Server ist nicht in der Lage zu rekonstruieren, die struct aus dem char-array.
Bitte lassen Sie mich wissen, was mache ich falsch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sizeof(regn)
gibt die Größe Ihrer gesamten StrukturRegistration
, währendsizeof(data)
ist die Größe des Zeigers auf Ihrem Computer, die 4 bytes (data
sollten Zeiger derRegistration
- Typ).In Ausdruck:
beachten Sie auch in printf
.
wird verwendet, um auf Elemente z.B.regn.multicastGroup
.memcpy
es zuunsigned char*
sizeof(struct Registration)
sendto()
? Csendto()
ich ersetztsizeof(data)
mitsizeof(regn)
und es wurde das Problem behoben.array[] = {}
; ist die gültige code - ? ich verstehe es nicht ?Während der code wird funktionieren, wenn Sie senden und empfangen auf die gleiche endian-Maschine - your-client und-server sollte im Idealfall führen Sie eine host-zu-Netzwerk-endian-Konvertierung zur Aufrechterhaltung der Kohärenz bei der überprüfung clientPid.
htonl
auf einer Variablen beim senden?