【问题标题】:Send struct over socket in C在 C 中通过套接字发送结构
【发布时间】:2013-07-22 22:35:36
【问题描述】:

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

示例消息 C 结构

struct Registration
{
char multicastGroup[24];
pid_t clientPid;
};

客户端代码sn-p序列化结构

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.  

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

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);
}

将struct复制到unsigned char *后,数组的大小只有4。
为什么数据没有完全复制到数组中?

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

【问题讨论】:

    标签: c serialization client-server


    【解决方案1】:

    sizeof(regn) 给出完整结构的大小Registration,而sizeof(data) 是计算机上指针的大小,为 4 个字节(data 应该是 Registration 类型的指针)。

    在表达式中:

    memcpy(data, &regn, sizeof(regn));
            ^     ^
            |     value variable of struct type 
            is pointer
    

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

    【讨论】:

    • 我想通过套接字发送这些数据。因此我是memcpy它到unsigned char*
    • @cppcoder 您使用哪个函数,如果需要存储的数据大小,那么您将使用sizeof(struct Registration)
    • @cppcoder 欢迎来到 SO。不要忘记接受解决您问题的答案:meta.stackexchange.com/questions/5234/…
    • @GrijeshChauhan 在sendto() 中,我将sizeof(data) 替换为sizeof(regn),它解决了这个问题。
    • @sehe hey Sehe 谢谢!,记住你 :) 那天你在 C++ 中给出了一个棘手的答案
    【解决方案2】:

    虽然如果您在同一台机器上发送和接收代码,则代码可以正常工作 - 您的客户端和服务器在理想情况下应该执行主机到网络端的转换,以在检查 clientPid 时保持一致性。

    【讨论】:

    • 您能否展示如何在发送时对变量执行htonl
    猜你喜欢
    • 2015-01-02
    • 2016-06-06
    • 2018-06-26
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2010-11-22
    相关资源
    最近更新 更多