簡體   English   中英

在C中通過套接字發送struct

[英]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, &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);
}

將結構復制到unsigned char * ,數組的大小僅為4。
為什么數據沒有完全復制到數組?

服務器無法從char數組重構結構。
請讓我知道我做錯了什么。

sizeof(regn)給出完整結構的大小Registration ,wheof sizeof(data)是機器上指針大小為4個字節( data應該是Registration類型的指針)。

在表達中:

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

也請注意printf , . 用於訪問元素,例如regn.multicastGroup

如果您在同一端機器上發送和接收代碼,則代碼將起作用 - 您的客戶端和服務器理想情況下應執行網絡端序轉換的主機,以便在檢查clientPid時保持一致性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM