user-0 提问: Visual Studio 2017编译可以运行的程序在运行过程中出现停止工作

回复:
user: user-1
content: 贴这么长代码给谁看呢？你自己就不能定位一下问题？这么多代码全都是有问题的？？  而且你都不知道调试一下吗？

user: user-1
content: 贴这么长代码给谁看呢？你自己就不能定一下问题？这么多代码全都是有问题的？？

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: void chatting_client(SOCKET sc) { 	system("cls"); 	system("color 0a"); 	int receiveLength; 	char SMess[1000];			//发送消息的缓存 	char RMess[1000];			//接收消息的缓存 	char SName[200];			//服务端用户的姓名 	char CName[200];			//客户端用户的姓名 	int nResult;  	nResult = recv(sc, RMess, strlen(RMess), 0);     //确认文件传送模块连接成功 	if (nResult == -1)           //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return; 	} 	printf("%s\n", RMess);  	printf("请输入你的名字：");      //客户端用户的姓名 	gets_s(CName);  	while (strlen(CName) == 0) 	{ 		printf("用户名不能为空! 请输入你的名字：\n"); 		gets_s(CName); 	}  	send(sc, CName, strlen(CName) + 1, 0);   //向服务端发送姓名 	receiveLength = recv(sc, SName, 200, 0); //接收服务端用户的姓名 	if (receiveLength == -1)                //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return; 	} 	printf("你已和%s取的连接……\n", SName); 	printf("开始聊天(输入exit退出聊天程序)……\n");  	while (1) 	{ 		struct tm *local; 		time_t t;						//调用时间函数，显示用户的操作时间 		t = time(NULL); 		local = localtime(&t); 		nResult = recv(sc, RMess, M, 0);		 //接收服务端发送过来的消息 		if (nResult == -1)                //判断服务端是否关闭 		{ 			printf("\n服务端已断开\n"); 			system("pause"); 			return; 		}  		if (strcmp(RMess, "exit") == 0) 		{ 			printf("服务端已退出聊天程序,本程序也即将退出!\n"); 			system("pause"); 			break; 		} 		printf("%s\t%d:%d:%d  \n    %s\n", SName, local->tm_hour, local->tm_min, local->tm_sec, RMess);  		printf("\n请输入信息：");      //客户端用户输入消息 		gets_s(SMess); 		if (strcmp(SMess, "exit") == 0) 		{ 			send(sc, SMess, strlen(SMess) + 1, 0); 			printf("你已退出聊天程序!\n"); 			system("pause"); 			break; 		} 		//服务端显示自己的消息 		t = time(NULL); 		local = localtime(&t); 		printf("\r%s\t%d:%d:%d  \n    %s\n", CName, local->tm_hour, local->tm_min, local->tm_sec, SMess); 		send(sc, SMess, strlen(SMess) + 1, 0); 	} }  void sendFile(SOCKET ss) { 	char *str1 = "....确认成功...."; 	send(ss, str1, strlen(str1) + 1, 0);			//向客户端发送验证信息  	FILE *fp; 	long i;									//文件分的的块数  	char fileAddr[300]; 	char fileName[100]; 	char file_name[FILE_NAME_MAX_SIZE + 1]; 	memset(file_name, 0, FILE_NAME_MAX_SIZE + 1); 	printf("Please Input File Name On Server: "); 	scanf("%s", &file_name);  	char buffer[BUFFER_SIZE]; 	memset(buffer, 0, BUFFER_SIZE); 	strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name)); dmm: 	printf("请输入要传送的文件绝对地址(含文件名)：");  	gets_s(fileAddr);  	if ((fp = fopen(fileAddr, "rb")) == NULL)   //打开文件 	{ 		printf("文件地址输入错误!\n"); 		goto dmm; 	} 	getW_name(fileAddr, fileName); 	send(ss, fileName, strlen(fileName) + 1, 0);  //发送文件名  	fseek(fp, 0L, 2); 	long fileLength = ftell(fp);				//取得文件的长度 	fseek(fp, 0L, 0);  	char Length[100]; 	LongToChar(fileLength, Length); 	send(ss, Length, strlen(Length) + 1, 0);		//发送文件大小到客户端   	if (0 == fileLength%M)					//对文件进行分块 	{ 		i = fileLength / M; 	} 	else 	{ 		i = fileLength / M + 1; 	}  	char mess[M]; 	long readLength;						//从文件读取的长度 	long sendLength;						//发送文件的长度 	int k = 1;								//正在传送的模块号  	char *temp = "开始接收文件";				//向客户端开始传送，确认同步开始 	int nResult; 	nResult = recv(ss, mess, M, 0); 	if (nResult == -1)                   //判断客户端是否关闭 	{ 		printf("\n客户端已断开\n"); 		system("pause"); 		return; 	} 	send(ss, temp, strlen(temp) + 1, 0); 	printf("%s,共 %ld 模块：\n", mess, i); 	long total = 0; 	while (k <= i) 	{ 		Sleep((DWORD)800);			//此非常重要，降低了传输时间，保证了两边的同步 		readLength = fread(mess, sizeof(char), M, fp); 		sendLength = send(ss, mess, readLength, 0); 		total += sendLength; 		printf("\r第 %d 模块   读取：%ldB  发送：%ldB", k, readLength, sendLength); 		printf("  进度: %2.2f%c  模块：%ld / %ld", 100 * (total*1.0 / fileLength), 37, k, i); 		if (sendLength == SOCKET_ERROR) 		{ 			printf("失败!"); 		} 		k++; 	} 	fclose(fp); 	printf("\n文件发送完成!\n"); 	system("pause"); }   void chatting_server(SOCKET s_d) { 	system("color 0a"); 	char *str1 = "你同意了……"; 	send(s_d, str1, strlen(str1) + 1, 0);  	int receiveLength;			//接收消息的长度 	char SMess[1000];			//发送消息的缓存 	char RMess[1000];			//接收消息的缓存 	char SName[200];			//服务端用户的姓名 	char CName[200];			//客户端用户的姓名   	receiveLength = recv(s_d, CName, 200, 0); 	if (receiveLength == -1)		 //判断客户端是否关闭 	{ 		printf("客户端已断开\n"); 		system("pause"); 		return; 	} 	printf("你已和%s取的连接……\n", CName);  	printf("请输入你的名字："); 	gets_s(SName); 	while (strlen(SName) == 0)		//循环检测用户名是否合法 	{ 		printf("用户名不能为空!  请输入你的名字：\n"); 		getchar(); 		gets_s(SName); 	}  	send(s_d, SName, strlen(SName) + 1, 0);	//向客户端发送姓名 	printf("\n开始聊天(输入exit退出聊天程序)……\n"); 	while (1) 	{ 		struct tm *local; 		time_t t; 		t = time(NULL); 		local = localtime(&t); 		printf("\n\n请输入信息："); 		gets_s(SMess); 		if (strcmp(SMess, "exit") == 0)   //用户输入‘exit’退出程序 		{ 			send(s_d, SMess, strlen(SMess) + 1, 0); 			printf("你已退出聊天程序!\n"); 			system("pause"); 			break; 		} 		//在服务端显示自己的消息 		printf("\r%s\t%d:%d:%d\n    %s\n", SName, local->tm_hour, local->tm_min, local->tm_sec, SMess); 		send(s_d, SMess, strlen(SMess) + 1, 0);  		//在服务端显示客户端消息 		t = time(NULL); 		local = localtime(&t); 		receiveLength = recv(s_d, RMess, M, 0); 		if (receiveLength == -1)		 //判断客户端是否关闭 		{ 			printf("客户端已断开\n"); 			system("pause"); 			return; 		} 		if (strcmp(RMess, "exit") == 0) 		{ 			printf("\n客户端已退出聊天程序,本程序也即将退出!\n"); 			system("pause"); 			break; 		} 		printf("\n%s\t%d:%d:%d\n    %s\n", CName, local->tm_hour, local->tm_min, local->tm_sec, RMess); 	}  }  void getW_name(char waddr[], char wname[]) { 	int i, k = 0, j, w_len = strlen(waddr); 	for (i = w_len - 1; i >= 0; i--) 	{ 		if (waddr[i] == '\\') 			break; 		wname[k++] = waddr[i]; 	} 	wname[k++] = '\0'; 	i = strlen(wname); 	for (j = 0, k = i - 1; j<i / 2; j++, k--) 	{ 		char temp = wname[j]; wname[j] = wname[k]; wname[k] = temp; 	} }  int receiveFile(SOCKET sc) { 	system("color 0a"); 	int nResult; 	char mess[M]; 	nResult = recv(sc, mess, strlen(mess), 0);    //确认文件传送模块连接成功 	if (nResult == -1)                       //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return 0; 	} 	printf("%s\n", mess);   	char fileName[50]; 	nResult = recv(sc, fileName, 50, 0);       //接收文件名 	if (nResult == -1)                    //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return 0; 	} 	nResult = recv(sc, mess, M, 0);             //接受文件的大小 	if (nResult == 		804 		- 1)                    //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return 0; 	}  	long fileLength = StrToLong(mess);      //取的待传送文件的长度 	long i;	                              //存放文件块数  	if (0 == fileLength%M)				  //对文件按N单位进行分块 	{ 		i = fileLength / M; 	} 	else 	{ 		i = fileLength / M + 1; 	}   	FILE *fp;							//打开文件 	int k = 1;					    	//当前正在接收文件的块数 	long receiveLength;					//接收文件的长度 	long writeLength;					//已写到文件的字符长度 	fp = fopen(fileName, "wb"); 	char *temp = "开始传送文件"; 	send(sc, temp, strlen(temp) + 1, 0);		//向客户端开始传送，确认同步开始 	nResult = recv(sc, mess, M, 0);			//接收服务端的确认消息 	if (nResult == -1)                  //判断服务端是否关闭 	{ 		printf("\n服务端已断开\n"); 		system("pause"); 		return 0; 	} 	printf("%s,共 %ld 模块：\n", mess, i);  	long total = 0;						//已接收文件的长度 	while (k <= i)                         //循环的接收文件 	{ 		receiveLength = recv(sc, mess, M, 0); 		if (receiveLength == -1)        //判断服务端是否关闭 		{ 			printf("\n服务端已断开\n"); 			system("pause"); 			return 0; 		}  		writeLength = fwrite(mess, sizeof(char), receiveLength, fp); 		printf("\r第 %d 模块   接收：%ldB  写入：%ldB", k, receiveLength, writeLength); 		total += writeLength; 		printf("  进度: %2.2f%c  模块：%ld / %ld", 100 * (total*1.0 / fileLength), 37, k, i); 		k++; 	}   	fclose(fp); 	printf("\n文件接收完成!\n"); 	system("pause"); 	return 0; }   void LongToChar(long x, char a[]) { 	int count = 0; 	if (x == 0) 		return; 	while (x) 	{ 		a[count++] = x % 10 + '0'; 		x = x / 10; 	} 	a[count] = '\0'; 	for (int i = 0, j = count - 1; i<count / 2; i++, j--) 	{ 		char temp; 		temp = a[i]; 		a[i] = a[j]; 		a[j] = temp; 	} }  long StrToLong(char str[]) { 	long result; 	bool bEnd; 	bEnd = true; 	result = 0; 	for (int i = 0; bEnd; i++) 	{ 		if (str[i] != '\0' && str[i] >= '0' && str[i] <= '9') 		{ 			result = result * 10 + str[i] - '0'; 		} 		if (str[i] == '\0') 		{ 			bEnd = false; 		} 	} 	return result; } 我用Visual Studio 2017编译可以运行，这段源码的聊天部分是可用的，但是文件传送部分有问题，在客户端接受传输请求后程序会停止工作，求大神们帮忙看一下