2016-01-26 3 views
0

Я создаю систему сообщений на основе кафки, которая должна сбрасывать в кафке сложную структуру C. Для начала я пытаюсь сделать что-то простое, создав простую структуру и отправить его:Отправить двоичную структуру кафке с помощью 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 байт):

Полезная нагрузка Сообщение шестнадцатеричного (8 байт):

00000000: 01 00 00 00 01 00 00 00

Struct р: -469758844 32530


I, J были 256,256

% Сообщение (смещение 1, 8 байт):

Полезная нагрузка Сообщение шестнадцатеричного (8 байт):

00000000: 00 80 00 00 80 00 00 00

Struct р: -469758810 32530


I, J были 4294967295 (макс целое), 4294967295 (макс целое)

% Messa GE (смещение 2, 8 байт):

Payload Сообщение шестнадцатеричного (8 байт):

00000000: FF FF FF FF FF FF FF FF

Struct р: -469758776 32530


I, J были 0,0

% сообщения (смещение 3, 8 байт):

Сообщи е Payload шестнадцатеричного (8 байт):

00000000: 00 00 00 00 00 00 00 00

Struct р: -469758742 32530


Как правильно сбросить и получить структуру? Я знаю, что могу сериализовать данные, но в будущем мне придется отправлять гораздо более сложную непрозрачную структуру. Более того, путем сериализации я могу использовать гораздо больше памяти.

Благодаря

ответ

1

Я думаю rd_kafka_consume(rkt, partition, 1000) уже возвращает указатель на вас так, в приведенном ниже заявлении вам не нужно &

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

Надеется, что это помогает.

+0

Фактически, «полезная нагрузка» является '(void *)', поэтому это имеет смысл. – dubafek

+0

правый. Полезная нагрузка - это указатель на пустоту, поэтому требуется указатель структуры. Читая данные, напечатанные с помощью hexdump, ясно, что данные сохранены правильно. Например, 01 00 00 00 01 00 00 00 = 1, 1. Но p: -469758844 32530 вместо этого выглядит скорее как адрес. Действительно, читая значение один за другим, только первая часть меняет –

+0

@ Сильвестро. Не могли бы вы уточнить, что вы получаете, когда печатаете 'struct p' после внесения вышеуказанного изменения? – vmachan

Смежные вопросы