2013-10-21 56 views
0

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

/客户端给出: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本身它是通过插座是不能够检索发送后得到printed.But打印..

回答

0

数据指向temp实际上并不是一个字符串,因此您不能使用字符串函数(如strlen)。

想一下,如果中间的一个字节为零(即字符串终止符'\0')会发生什么情况,函数会查找该字符串以便知道字符串何时结束,从而停止其处理。

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

在接收方,您可能会遇到更严重的问题,您告诉recvfrom最多可以接收1024字节,而不是例如。 sizeof(t_msg)。如果sizeof(t_msg)小于1024,可能会导致recvfrom超出分配的数据。

+0

你能告诉我我必须用什么来代替strlen吗?还有如何检索接收端的数据?我必须做出什么样的改变? –

+0

@HarilalOP当你分配内存时,你已经拥有*的大小。使用它。至于'sizeof(recv_data)'的用法,在检查错误之后,使用你接收到的字节数('bytes_read')。另外,如果您使用TCP,您可能会收到*少于*的请求,因此您需要再次收到。 –

+0

@HarilalOP我个人不了解“avro”函数或消息。我只根据原始问题中提供的代码进行回答。 –