通过套接字发送avro(avro c)编码数据

通过套接字发送avro(avro c)编码数据,c,sockets,avro,C,Sockets,Avro,通过套接字发送avro(avro c)编码数据 在将avro编码的数据转换成字节数组(使用memcpy)后,我试图通过套接字发送它 /客户端:client.c/ /服务器端:server.c/ 但是它没有得到任何东西…当我尝试在clent.c中解码和打印时,它被打印出来了。但是在通过套接字发送后,它无法检索。由temp指向的数据实际上不是字符串,因此不能使用类似strlen的字符串函数 想想如果中间的一个字节为零(即字符串终止符 \ 0’< /COD>),则函数查找字符串何时结束,因此将停止它们

通过套接字发送avro(avro c)编码数据 在将avro编码的数据转换成字节数组(使用memcpy)后,我试图通过套接字发送它

/客户端:client.c/

/服务器端:server.c/


但是它没有得到任何东西…当我尝试在clent.c中解码和打印时,它被打印出来了。但是在通过套接字发送后,它无法检索。

temp
指向的数据实际上不是字符串,因此不能使用类似
strlen
的字符串函数

想想如果中间的一个字节为零(即字符串终止符<代码> \ 0’< /COD>),则函数查找字符串何时结束,因此将停止它们的处理。

在接收端,您还有另一个问题,那就是您使用的
sizeof(recv_data)
,根据您是在32位还是64位平台上,它总是
4
8
字节。
sizeof
运算符是仅编译时的运算符,对于指针,它返回指针的大小,而不是指针指向的内容


在接收端,您有一个潜在的更糟糕的问题,那就是您告诉
recvfrom
最多接收
1024
字节,而不是例如
sizeof(t_msg)
。如果
sizeof(t_msg),这可能会导致
recvfrom
写入超出分配的数据
小于
1024

你能告诉我用什么代替strlen吗?还有如何在接收端检索数据?我需要做哪些更改?@HarilalOP分配内存时,您已经有了大小。用那个。至于使用
sizeof(recv_data)
,当然要在检查错误后使用您收到的字节数(
bytes_read
)。另外,如果您使用TCP,您实际收到的信息可能比要求的要少,因此您需要再次收到。@HarilalOP我个人对“avro”函数或消息一无所知。我只是根据原始问题中给出的代码进行回答。
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
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