0

我正在创建一个基于 kafka 的消息系统,它必须在 kafka 中转储一个复杂的 C 结构。首先,我试图通过创建一个简单的结构并发送它来做一些简单的事情:

struct Points {
   int   x,y;
} points;

struct Points p;

p.x=0;
p.y=0;

size_t len = sizeof(p);

在生产者中:

rd_kafka_produce(rkt, partition,RD_KAFKA_MSG_F_COPY,&p, len,NULL, 0,NULL)

在消费者中,我定义了相同的结构,但随后我使用:

rkmessage = rd_kafka_consume(rkt, partition, 1000);
struct Points* p2=(struct Points*)&(rkmessage->payload);
            printf("Struct p: %d %d\n\n",p2->x,p2->y);

但它打印垃圾。

i,j 是 1,1

% 消息(偏移量 0,8 个字节):

消息有效负载 hexdump(8 个字节):

00000000: 01 00 00 00 01 00 00 00

结构 p:-469758844 32530


i,j 为 256,256

% 消息(偏移量 1,8 个字节):

消息有效负载 hexdump(8 个字节):

00000000: 80 00 00 00 80 00 00 00

结构 p:-469758810 32530


i,j 是 4294967295(最大整数),4294967295(最大整数)

% 消息(偏移量 2,8 字节):

消息有效负载 hexdump(8 个字节):

00000000: ff ff ff ff ff ff ff ff

结构 p:-469758776 32530


i,j 为 0,0

% 消息(偏移量 3,8 字节):

消息有效负载 hexdump(8 个字节):

00000000: 00 00 00 00 00 00 00 00

结构 p:-469758742 32530


如何正确转储并获取结构?我知道我可能会序列化数据,但将来我将不得不发送一个更复杂的不透明结构。此外,通过序列化它,我可能会使用更多的内存。

谢谢

4

1 回答 1

1

我认为rd_kafka_consume(rkt, partition, 1000)已经返回一个指向你的指针,所以在下面的语句中你不需要&

struct Points* p2=(struct Points*)(rkmessage->payload);

希望这可以帮助。

于 2016-01-26T02:29:11.893 回答