인스턴트 메시징 (메시징) 세그먼트 화 오류가 발생하여 클라이언트 - 서버 파일 전송을 테스트하는 중 오류가 발생했습니다. 나는 (내가 문제가 생각하는 곳입니다) 다운로더 측이 코드를 가지고 :세그먼트 오류 - 큰 루프
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를 사용하여 메모리를 디버깅하는 좋은 방법이 있다면 알려주십시오. 고마워요, 제 영어 수준에 대해 사과드립니다.
하나의 컴퓨터에서 올바르게 작동하지만 다른 컴퓨터에서는 작동하지 않는 코드에 대해서는 이상한 것이 없습니다. 그건 정상입니다. – john
당신은 정말로 작고 읽기 쉬운 함수로 함수를 나누는 것을 고려해야한다. –