2013-09-21 4 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); 
       } 

서버가 데이터를 전송 비슷한 루프에 있습니다. 이상한 부분은 내가 랩탑에서 이걸 실행하면 작동하지만 학교 PC의 가상 머신에서 세그멘테이션 오류가 발생한다는 것입니다. VMware Player를 사용하여 메모리를 디버깅하는 좋은 방법이 있다면 알려주십시오. 고마워요, 제 영어 수준에 대해 사과드립니다.

+1

하나의 컴퓨터에서 올바르게 작동하지만 다른 컴퓨터에서는 작동하지 않는 코드에 대해서는 이상한 것이 없습니다. 그건 정상입니다. – john

+1

당신은 정말로 작고 읽기 쉬운 함수로 함수를 나누는 것을 고려해야한다. –

답변

1

free(file_buffer);이 잘못되었습니다. 나는 당신이 munmap(file_buffer, file_size);을 의미했다고 생각합니다.

+0

그게 전부 야! 정말 감사합니다! – DemianArdus

+1

@ user2796026 문제는 없지만 claptrap이 위에 언급 한 내용을 고려해야합니다. 이런 종류의 실수는 더 작은 함수를 작성할 때 훨씬 쉽게 볼 수 있습니다. – john