我正在创建一个基于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);
但它打印垃圾。
我,j是1,1
%消息(偏移0,8个字节):
Message Payload hexdump(8字节):
<00> 00000000:01 00 00 00 01 00 00 00Struct p:-469758844 32530
我,j是256,256
%消息(偏移1,8字节):
Message Payload hexdump(8字节):
<00> 00000000:80 00 00 00 80 00 00 00Struct p:-469758810 32530
i,j为4294967295(max int),4294967295(max int)
%消息(偏移量2,8字节):
Message Payload hexdump(8字节):
00000000:ff ff ff ff ff ff ff ff
Struct p:-469758776 32530
我,j是0,0
%消息(偏移3,8字节):
Message Payload hexdump(8字节):
<00> 00000000:00 00 00 00 00 00 00 00结构p:-469758742 32530
如何正确转储并获取结构?我知道我可能会对数据进行序列化,但将来我将不得不发送更复杂的不透明结构。此外,通过序列化,我可以使用更多的内存。
谢谢
答案 0 :(得分:1)
我认为rd_kafka_consume(rkt, partition, 1000)
已经返回指向您的指针,因此在下面的语句中您不需要&
struct Points* p2=(struct Points*)(rkmessage->payload);
希望这会有所帮助。