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

时间:2013-10-21 06:32:29

标签: c sockets avro

通过套接字发送avro(avro c)编码数据 我试图在将其转换为字节数组(使用memcpy)后通过套接字发送avro编码数据。我所做的是如下所示

/ 客户端: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中打印时它会被打印出来。但是在通过套接字发送后它无法检索..

1 个答案:

答案 0 :(得分:0)

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

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

在接收方,您还有另一个问题,就是您使用sizeof(recv_data),这将始终为48个字节,具体取决于您是否使用32或64位平台。 sizeof运算符是仅编译时运算符,对于指针,它返回指针的大小而不是它指向的大小。

在接收方,您可能会遇到更严重的问题,即您告诉recvfrom最多接收1024个字节,而不是sizeof(t_msg)。如果recvfrom小于sizeof(t_msg),这可能会导致1024在分配的数据之外写入。