1

ソケットを介してクライアントに送信する構造体があります。クライアントとサーバーの両方が同じアーキテクチャ上にあるため、エンディアンの問題はありません。int値を正しく受け取ります。しかし、char[]値を正しく受け取ることができません。これが構造です。

struct Packet {
int id;
int number;
char data[256];
};

サーバー側では、データをシリアル化してクライアントに書き込みます。

struct Packet *s = new Packet();
s->id= htonl(1000);
s->number= htonl(7788);
memcpy(s->data, "MESSAGE", 7);

n =  write(NewSockFD , s ,sizeof(s) );

クライアント側では、データを逆シリアル化します。

n = read(SockFD , Buffer , sizeof(Buffer));
struct Packet *s = (struct Packet*)Buffer;
char b[256];
int i = ntohl(s->id);
int j = ntohl(s->number);
memcpy(b, s->data, sizeof(s));

idとnumberの値を正しく受け取ります。問題はデータ値にあります。私はここで何を間違っているのですか??..

4

1 に答える 1

1

コードでは、 を使用しますsizeof(s)Packet*これはではなくのサイズになりますPacket。に置き換えてsizeof(*s)、正しいサイズを取得します。

さらに、 の値dataがすべて初期化されているわけではないため、そこから読み取ると未定義の動作が発生します。いずれかの方法ですべての要素を初期化する必要があります (最短の方法はchar data[256] { };、構造体定義で行うことです)。

また、これは C++ であるため、 という名前の関数も持っていない限り、struct Packetと言う必要はありません。しかし、それは半分の時間しかコードに表示されないため、ドロップすることができます。PacketPacket

Chris G が述べたように、それを修正した後、別の問題がPacket発生しchar[]ます。変化するPacketdata

memcpy(b, s->data, sizeof(s))

memcpy(b, s->data, sizeof(s->data))

またdata、送信者があなたのためにそれを行っていない場合、これはヌル終端されない可能性があることに注意してください (予防策を講じる必要がある場合があります)。

于 2013-01-18T05:11:53.113 に答える