【问题标题】:Send binary structure to kafka with C用C将二进制结构发送到kafka
【发布时间】:2016-01-26 10:29:11
【问题描述】:

我正在创建一个基于 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

% Message (offset 0, 8 bytes):

消息负载 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(max int),4294967295(max int)

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

消息负载 hexdump(8 字节):

00000000: ff ff ff ff ff ff ff

结构 p:-469758776 32530


i,j 为 0,0

% Message (offset 3, 8 bytes):

消息负载 hexdump(8 字节):

00000000: 00 00 00 00 00 00 00 00

结构 p:-469758742 32530


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

谢谢

【问题讨论】:

    标签: c apache-kafka kafka-consumer-api kafka-producer-api


    【解决方案1】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 实际上,payload(void *),所以这是有道理的。
    • 正确。有效负载是一个空指针,因此它需要结构指针。通过读取 hexdump 打印的数据,可以清楚地看到数据保存正确。例如,01 00 00 00 01 00 00 00 = 1, 1。但是 p: -469758844 32530 看起来更像是一个地址。事实上,通过一个接一个地读取值,只有第一部分会发生变化
    • @Silvestro,您能否详细说明在进行上述更改后打印struct p 时得到的结果?
    • 如果我们使用 java 库作为消费者和 C 作为生产者,我们如何解码它?
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2016-03-29
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多