[英]Send struct over socket in C
我正在開發一個客戶端/服務器程序,我的客戶端必須向服務器發送消息。
示例消息C結構 :
struct Registration
{
char multicastGroup[24];
pid_t clientPid;
};
用於序列化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.
用於反序列化數據的服務器代碼
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);
}
將結構復制到unsigned char *
,數組的大小僅為4。
為什么數據沒有完全復制到數組?
服務器無法從char數組重構結構。
請讓我知道我做錯了什么。
sizeof(regn)
給出完整結構的大小Registration
,wheof sizeof(data)
是機器上指針大小為4個字節( data
應該是Registration
類型的指針)。
在表達中:
memcpy(data, ®n, sizeof(regn));
^ ^
| value variable of struct type
is pointer
也請注意printf , .
用於訪問元素,例如regn.multicastGroup
。
如果您在同一端機器上發送和接收代碼,則代碼將起作用 - 您的客戶端和服務器理想情況下應執行網絡端序轉換的主機,以便在檢查clientPid時保持一致性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.