7

クライアント/サーバー プログラムを開発していますが、クライアントはサーバーにメッセージを送信する必要があります。

サンプルメッセージ C 構造:

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

構造体をシリアル化するためのクライアント コード スニペット

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 配列から構造体を再構築できません。
私が間違っていることを教えてください。

4

2 に答える 2

10

sizeof(regn)完全な構造体のサイズを示しますが、マシン上のRegistrationポインターsizeof(data)のサイズは 4 バイトです (型dataのポインターである必要がありますRegistration)。

式では:

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

printf にも注意してください。.要素にアクセスするために使用されますregn.multicastGroup

于 2013-07-23T17:43:59.470 に答える
4

同じエンディアン マシンで送信と受信を行う場合、コードは機能しますが、クライアントとサーバーは、clientPid を検査するときに一貫性を維持するために、理想的にはホストからネットワークへのエンディアン変換を実行する必要があります。

于 2013-07-23T18:54:46.817 に答える