在C中通过套接字发送struct

cpp*_*der 7 c serialization client-server

我正在开发一个客户端/服务器程序,我的客户端必须向服务器发送消息.

示例消息C结构:

struct Registration
{
char multicastGroup[24];
pid_t clientPid;
};
Run Code Online (Sandbox Code Playgroud)

用于序列化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, &regn, sizeof(regn));
printf("Size:%d\n", sizeof(data));           //Size is 4.  
Run Code Online (Sandbox Code Playgroud)

用于反序列化数据的服务器代码

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(&regn, recvBuf, sizeof(regn));
       printf("PID:%d\n", regn.clientPid);
       printf("MG:%s\n", regn.multicastGroup);
}
Run Code Online (Sandbox Code Playgroud)

复制结构后unsigned char *,数组的大小只有4.
为什么数据没有完全复制到数组?

服务器无法从char数组重构结构.
请让我知道我做错了什么.

Gri*_*han 10

sizeof(regn)给你的完整结构的大小Registration,wheras sizeof(data)是在机器上的指针是4个字节的尺寸(data应的指针Registration类型).

在表达中:

memcpy(data, &regn, sizeof(regn));
        ^     ^
        |     value variable of struct type 
        is pointer
Run Code Online (Sandbox Code Playgroud)

在printf中也注意到,.用于访问元素,例如regn.multicastGroup.

  • @GrijeshChauhan在`sendto()`中我用`sizeof(regn)`替换了`sizeof(data)`并解决了这个问题. (3认同)