即时消息分段错误测试客户端服务器文件传输。我在下载器端有这个代码(这是我认为问题所在):分段错误 - 大循环
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调试内存的好方法,请告诉我。 谢谢你,对不起我的英语水平。
对于在一台机器上正确运行但在另一台机器上运行正常的代码,没有什么奇怪的。这很正常。 – john
你真的应该考虑把你的函数分解成更小,更易读的函数,谁知道错误会变得明显。 –