在C中通过套接字发送struct
我正在开发一个客户端/服务器程序,我的客户端必须向服务器发送消息。
示例消息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时保持一致性。