gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:55 26 4
gpt4 key购买 nike

通过套接字发送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 本身中解码和打印时,它正在打印。但是通过套接字发送后,它无法检索......

最佳答案

temp指向的数据实际上不是字符串,因此您不能使用像 strlen 这样的字符串函数有了它。

考虑一下如果中间的一个字节为零(即字符串终止符 '\0' )会发生什么,函数会查找它以了解字符串何时结束,因此会在那里停止处理。

在接收端你还有另一个问题,就是你使用 sizeof(recv_data) ,永远是 48字节数取决于您使用的是 32 位还是 64 位平台。 sizeof运算符是仅编译时运算符,对于指针,它返回指针的大小,而不是它指向的内容。

在接收方,您可能会遇到更糟糕的问题,即您告诉 recvfrom最多可接收1024字节,而不是例如sizeof(t_msg) .这可能会导致recvfrom写入超出分配的数据 if sizeof(t_msg)小于 1024 .

关于c - 通过套接字发送 avro(avro c) 编码数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19487644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com