2013-09-21 104 views
-1

即時消息分段錯誤測試客戶端服務器文件傳輸。我在下載器端有這個代碼(這是我認爲問題所在):分段錯誤 - 大循環

else if (info_socket[fds[i].fd] == RECIBIENDO) { 
       close_conn = FALSE; 
       buffer = (char*) malloc(1500); 
       rc = recv(fds[i].fd, buffer, 1500, 0); 
       if (rc < 0) { 
        if (errno != EWOULDBLOCK) { 
         perror(" recv() failed"); 
         close_conn = TRUE; 
         map<int, info_trans*>::iterator it = descargas.find(fds[i].fd); 
         descargas.erase(it); 
        } 
       } else if (rc == 0) { 
        close_conn = TRUE; 
        map<int, info_trans*>::iterator it = descargas.find(fds[i].fd); 
        descargas.erase(it); 
       } else { 
        arch = fopen((directorio + descargas[fds[i].fd]->nombre_archivo).c_str(), "ab"); 
        printf("%s -- %d",(directorio + descargas[fds[i].fd]->nombre_archivo).c_str(),fds[i].fd); 
        totalEscrito = fwrite(buffer, 1, rc, arch); 
        descargas[fds[i].fd]->bytes_descargados = descargas[fds[i].fd]->bytes_descargados + totalEscrito; 
        fclose(arch); 
        file_descript = open((directorio + descargas[fds[i].fd]->nombre_archivo).c_str(), O_RDONLY); 
        file_size = get_size_by_fd(file_descript); 
        file_buffer = (char*) mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0); 
        MD5((unsigned char*) file_buffer, file_size, result); 
        mdString = (char*) malloc(33); 
        for (int r = 0; r < 16; r++) 
         sprintf(&mdString[r * 2], "%02x", (unsigned int) result[r]); 
        if (strcmp(mdString, (descargas[fds[i].fd]->md5).c_str()) == 0) { 
         close_conn = TRUE; 
         map<int, info_trans*>::iterator it = descargas.find(fds[i].fd); 
         descargas.erase(it); 
        } 
        free(mdString); 
        free(file_buffer); 
        close(file_descript); 
       } 

服務器處於發送數據的類似循環中。奇怪的部分是,如果我在我的筆記本電腦上運行它,它的工作原理,但在學校電腦的虛擬機引發Segmentation故障。 如果有一種使用VMware Player調試內存的好方法,請告訴我。 謝謝你,對不起我的英語水平。

+1

對於在一臺機器上正確運行但在另一臺機器上運行正常的代碼,沒有什麼奇怪的。這很正常。 – john

+1

你真的應該考慮把你的函數分解成更小,更易讀的函數,誰知道錯誤會變得明顯。 –

回答

1

free(file_buffer);是錯誤的。我想你的意思是munmap(file_buffer, file_size);

+0

就是這樣!非常感謝! – DemianArdus

+1

@ user2796026沒問題,你應該考慮一下上面評論中說的claptrap。當您編寫較小的函數時,這種錯誤更容易看到。 – john