2013-10-21 57 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」函數或消息。我只根據原始問題中提供的代碼進行回答。 –