我正在开发客户端/服务器程序,我的客户端必须向服务器发送消息。
示例消息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数组重构结构 请让我知道我做错了什么。
答案 0 :(得分:10)
sizeof(regn)
给出了完整结构的大小Registration
,而sizeof(data)
是机器上4个字节的指针大小(data
应该是{{1}的指针}} type。。
表达方式:
Registration
另请注意,在printf中,memcpy(data, ®n, sizeof(regn));
^ ^
| value variable of struct type
is pointer
用于访问元素,例如.
。
答案 1 :(得分:3)
如果您在相同的端机上发送和接收代码,则代码将起作用 - 您的客户端和服务器理想情况下应执行网络端序转换的主机,以便在检查clientPid时保持一致性。