отправка закодированных данных avro(avro c) через сокет

отправка закодированных данных avro (avro c) через сокет. Я пытаюсь отправить закодированные данные avro через сокет после преобразования его в массив байтов (с использованием memcpy). Что я сделал, как указано ниже

/клиентская сторона: client.c/

avro_datum_t t_msg = avro_record(temp_schema);

avro_record_set(t_msg, "TIME", time_datum)  // encoded like this
...
...

unsigned char *temp=(unsigned char *) malloc(sizeof(t_msg));
memcpy(temp,&t_msg,sizeof(t_msg));//converting to byte array
sendto(sock, &temp, strlen(temp), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));//send to socket

/на стороне сервера: server.c/

avro_datum_t time_datum;
..
..
unsigned char *recv_data=(unsigned char *) malloc(sizeof(t_msg));
avro_datum_t t_msg;
bytes_read = recvfrom(sock,recv_data,1024,0,(struct sockaddr *)&client_addr, &addr_len);
memcpy(bgpmsg1,recv_data,sizeof(recv_data));
if (avro_record_get(t_msg, "TIME", &time_datum) == 0) {
        printf("\nHi...0\n");
        avro_string_get(time_datum, &p);
        fprintf(stdout, "TIME: %s  ", p)
}

//trying to decode and print message like this

но он ничего не получает ... когда я пытаюсь декодировать и печатать в самом clent.c, он печатается. Но после отправки через сокет он не может получить ..


person Harilal OP    schedule 21.10.2013    source источник


Ответы (1)


Данные, на которые указывает temp, на самом деле не являются строкой, поэтому с ними нельзя использовать строковые функции, такие как strlen.

Подумайте о том, что произойдет, если один байт в середине равен нулю (т. е. ограничитель строки '\0'), функции ищут это, чтобы узнать, когда заканчивается строка, и поэтому останавливают свою обработку на этом.

На принимающей стороне у вас есть еще одна проблема, и вы используете sizeof(recv_data), который всегда будет 4 или 8 байт в зависимости от того, используете ли вы 32- или 64-битную платформу. Оператор sizeof работает только во время компиляции, и для указателей он возвращает размер указателя, а не то, на что он указывает.

На принимающей стороне у вас есть потенциально еще более серьезная проблема, заключающаяся в том, что вы говорите recvfrom получать до 1024 байт вместо, например, sizeof(t_msg). Это может привести к тому, что recvfrom будет записывать больше выделенных данных, если sizeof(t_msg) меньше 1024.

person Some programmer dude    schedule 21.10.2013
comment
не могли бы вы просто сказать мне, что я должен использовать вместо strlen? также Как получить данные на принимающей стороне? Какие все изменения я должен сделать? - person Harilal OP; 21.10.2013
comment
@HarilalOP У вас уже есть размер, когда вы выделяете память. Используйте это. Что касается использования sizeof(recv_data), используйте количество полученных байтов (bytes_read) после проверки на наличие ошибок, конечно. Кроме того, если вы используете TCP, вы можете фактически получить меньше, чем запрошено, поэтому вам нужно получить снова. - person Some programmer dude; 21.10.2013
comment
@HarilalOP Я лично ничего не знаю о функциях или сообщениях avro. Я ответил только на основе кода, представленного в исходном вопросе. - person Some programmer dude; 21.10.2013