2014-03-03 92 views
0

這是我的套接字客戶端的一部分,接收緩衝區比服務器的發送緩衝區小,所以我需要realloc的緩衝區,但它拋出的錯誤是這樣的:的realloc導致不正確的校驗和釋放對象

malloc: *** error for object 0x7fd44ad00018: incorrect checksum for freed object - object was probably modified after being freed. 

我代碼:

char recv_buf[MAX_RECV_LINE] = ""; 
while (fgets(buf, MAX_SEND_LINE, stdin) != NULL) { 
    write(servfd, buf, strlen(buf)); 
    char *recv_data = malloc(MAX_RECV_LINE); 
    bzero(recv_data, MAX_SEND_LINE); 
    int recv_size = 0; 
    while (1) { 
     FD_ZERO(&readfds); 
     FD_SET(servfd, &readfds); 
     select(servfd + 1, &readfds, NULL, NULL, &timeout); 
     if (FD_ISSET(servfd, &readfds)) { 
      bzero(recv_buf, MAX_RECV_LINE); 
      size_t recv_buf_len = recv(servfd, recv_buf, MAX_RECV_LINE, 0); 
      if (recv_buf_len == 0) { 
       printf("Server is closed.\n"); 
       close(servfd); 
       exit(0); 
      } 

      recv_data = realloc(recv_data, recv_size + recv_buf_len); 
      if (recv_data == NULL) { 
       exit(0); 
      } 
      printf("realloc: %lu\n", recv_size + recv_buf_len); 
      memcpy(recv_data + recv_size, recv_buf, recv_buf_len); 

      recv_size += recv_buf_len; 
     } else { 
      break; 
     } 
    } 
    printf("total count: %d\n", recv_size); 
    printf("Message: %s", recv_data); 
    free(recv_data); 
} 

和recv_data不能得到完全的消息

+1

非手,我沒有看到任何塗鴉。但是'memcpy'調用可能會寫入分配對象之外,這可能會解釋消息。仔細檢查各種理智的理智。 – vonbrand

+0

你的'recv_buf'是如何定義的? –

+0

char recv_buf [8] =「」; – NikSun

回答

1
char *recv_data = malloc(MAX_RECV_LINE); 
bzero(recv_data, MAX_SEND_LINE); 

的問題是在這裏。您正在分配一個大小爲MAX_RECV_LINE的緩衝區,但將其調零的長度爲MAX_SEND_LINE,您所說的長度更大。實際上,您不需要將其歸零:您的代碼似乎正確處理收到的數據。完全刪除bzero()

但是,在兩端使用相同的緩衝區大小會簡單很多。我總是用8192.

+0

哦!非常感謝,這是我的錯誤 – NikSun

+0

@NikSun不要尷尬,我們是電腦程序員,我們每天都會犯錯誤。這是一門實驗科學,也是一門分析性科學。 – EJP

0

兩個建議:

  • 您不檢查recv_buf_len是否爲負值(例如,從一個信號)。其類型應該是ssize_t,而不是size_t

  • IIRC,你需要重做timeout每次你打電話select(但這不會是問題的原因)。

+0

不檢查recv_buf_len,因爲服務器將回復我發送的相同消息。 – NikSun

相關問題