⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client_server.cpp

📁 (1)实现下载功能 server()为服务端主程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

}
	nResult=closesocket(s); //关闭套接字。
	if(nResult==SOCKET_ERROR) 
	{ 
	printf("8.关闭套接字(服务器端)失败!\n");
	} 
}

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(CName);

	while(strlen(CName)==0)
	{
		printf("用户名不能为空! 请输入你的名字:\n");
		gets(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(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];
dmm:
	printf("请输入要传送的文件绝对地址(含文件名):");

	gets(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(SName);
	while(strlen(SName)==0)		//循环检测用户名是否合法
	{
		printf("用户名不能为空!  请输入你的名字:\n");
		getchar();
		gets(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(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 == -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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -