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

📄 client_server.cpp

📁 (1)实现下载功能 server()为服务端主程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Winsock2.h>
#include <process.h>
#include <time.h>
#pragma comment(lib,"Ws2_32")
#define M 512000							 //每块传送文件的大小500k
#define portNum 8888						 //使用的端口号

void LongToChar(long x,char a[]);			//将long型整数转换成字符串

long StrToLong(char str[]);					//将字符串转换成long型整数

void getW_name(char waddr[],char wname[]);   //获取文件名函数

void sendFile(SOCKET ss);					 //服务端发送文件函数

int receiveFile(SOCKET sc);					//客户端接收文件函数

void chatting_client(SOCKET sc);				 //客户端聊天函数

void chatting_server(SOCKET s_d);			 //服务端聊天函数

int client();								 //客户端主程序

void server();								 //服务端主程序
	
void main()
{	
	system("cls");
	system("@color 0a");
	puts("\n");
	puts("	  *********************************************************");
	puts("    	  *							  * ");
	puts("    	  *   欢·迎·使·用·局·域·网·文·件·发·送·工·具  *");
	puts("    	  *			     			          * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *	 	       1.   客  户  端  	    	  * ");
	puts("    	  *							  * ");
	puts("    	  *		       2.   服  务  端 	    	          * ");
	puts("    	  *							  * ");
	puts("    	  *		       3.   结      束   		  * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *		      天乐软件工作室制作		  * ");
	puts("    	  *			  2008-3-1 			  * ");
	puts("    	  *		      版权所有★欢迎传播	  	  * ");
	puts("    	  *********************************************************\n");
	puts("全屏(退出全屏)操作请按:ALT+ENTER\n");
	printf("请输入你要选择的端代号(1-3):");

	char ch;
	char Num[10];
	gets(Num);
	ch=Num[0];
	while(ch >='4' || ch <='0')						//检测用户选择的代码是否符合要求
	{
		printf("\n你的输入有误!请重新输入:");
		gets(Num);
		ch=Num[0];
	}
	
	if('1'==ch)
	{
		client();
	}
	else if('2'==ch)
	{
		server();
	}
	else if('3'==ch)
	{
		exit(0);
	}
}




int client()
{
	system("color 0a");				//修改DOS窗口颜色,是其成0A。

	WORD wVersion=MAKEWORD(1,1); 
	WSADATA wsData; 
	int nResult= WSAStartup(wVersion,&wsData);  //启动WINSOCKET	
	if(nResult !=0) 
	{ 
	printf("启动Winsock失败!\n"); 
	} 

	SOCKET sc=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);  //创建套接字
	if(sc==INVALID_SOCKET) 
	{ 
	printf("创建套接字失败!\n"); 
	} 

	SOCKADDR_IN addrSc;
	addrSc.sin_family=AF_INET; 
	addrSc.sin_port=htons(portNum); //保证字节顺序 
	char IP[20];
again:
	printf("请输入服务器的IP地址:");
	gets(IP);	
	if( -1==inet_addr(IP) )   //循环检测IP地址是否合法
	{
		printf("IP地址错误!\n");
		goto again;
	}
	addrSc.sin_addr.S_un.S_addr=inet_addr(IP); 


	int b=0;
	while(b<5)               //检测5次,如果服务器在此时间内启动,则进行连接
	{
		nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR)); //套接字连接
		Sleep((DWORD)100);				//延时1秒
		if(nResult==SOCKET_ERROR) 
		{ 
		printf("  %d 次连接失败!\n",b+1);
		}
		else
			break;
		b++;
	}
	if(nResult==SOCKET_ERROR)
	{
	printf("登陆超时,请重新登陆!\n");
	goto again;
	}

	char *buf="连接成功!";                   //向服务端验证连接成功
	nResult=send(sc,buf,strlen(buf)+1,0); 
	if(nResult==SOCKET_ERROR)
	{ 
	printf("5.套接字发送数据失败!\n");
	return 0;
	}
	char mess[M];
	nResult =recv(sc,mess,strlen(mess),0);     //接受服务端的连接验证信息
	if(nResult == -1 )                         //判断服务端是否关闭
	{
		printf("\n服务端已断开\n");
		system("pause");
		exit(0);
	}
	printf("%s\n",mess);

///////////////////////////////////////////////////////////////////////////
////                       功能菜单及操作                              ////
///////////////////////////////////////////////////////////////////////////

tianle:	
	system("cls");             //清屏
	puts("\n\n");
	puts("	  *********************************************************");
	puts("    	  *							  * ");
	puts("    	  *   欢·迎·使·用·局·域·网·文·件·发·送·工·具  *");
	puts("    	  *			(客   户   端)			  * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *		   请等待服务端的相应操作		  * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *		      天乐软件工作室制作		  * ");
	puts("    	  *			  2008-3-1 			  * ");
	puts("    	  *		      版权所有★欢迎传播	  	  * ");
	puts("    	  *********************************************************\n");
	puts("全屏(退出全屏)操作请按:ALT+ENTER\n");

		char rMess[100];
		nResult=recv(sc,rMess,strlen(rMess),0);         //接收服务端发来的操作请求
		if(nResult==-1)                              //判断服务端是否关闭
		{
		printf("\n服务端已断开\n");
		system("pause");
		goto tianle;
		}
		printf("%s\n",rMess);

		char ch;
		char str[100];
		gets(str);
		ch=str[0];
		while( ch!='Y' && ch!='y' && ch!='N' && ch!='n' ) //处理客户端的错误输入
		{
			printf("输入有误,请重新输入(Y/N):");
			gets(str);
			ch=str[0];
		}
		
		send(sc,&ch,sizeof(char),0); //向服务端反馈选择,并执行相应操作
		if(strcmp(rMess,"服务端向你传送文件,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') )
		{
			receiveFile(sc);
		}
		if(strcmp(rMess,"服务端向你发起聊天,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') )
		{
			chatting_client(sc);
		}
		if(ch=='N' || ch=='n')
		{
			printf("你拒绝了!\n");
			system("pause");
		}			
	system("cls");
	goto tianle;

	nResult=closesocket(sc);  //关闭套接字
	if(nResult==SOCKET_ERROR) 
	{ 
	printf("8.关闭套接字失败!\n");
	return 0;
	} 
}

void server()
{
	system("color 0a");						//修改DOS窗口颜色为0A
	WORD wVersion=MAKEWORD(1,1); 
	WSADATA wsData; 
	int nResult= WSAStartup(wVersion,&wsData); //1、启动Winsock
	if(nResult !=0) 
	{ 
	printf("启动Winsock失败!\n"); 
	} 

	SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //2.创建套接字
	if(s==INVALID_SOCKET) 
	{ 
	printf("创建套接字失败!\n"); 
	} 

	SOCKADDR_IN addr; 
	addr.sin_family=AF_INET; 
	addr.sin_port=htons(portNum); //保证字节顺序 
	addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr)); //3、套接字的绑定
	if(nResult==SOCKET_ERROR) 
	{ 
	printf("套接字的绑定失败!\n");
	} 

	nResult=listen(s,5); //最多5个连接, 套接字的监听
	if(nResult==SOCKET_ERROR) 
	{ 
	printf("套接字的监听(服务器端)失败!\n"); 
	} 


	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	printf("\n等待客户端的连接");
	
	int a=0;
	while(a<5)										//开始的一个小动态图形
	{
		for(int b=0;b<8;b++)
		{
			Sleep(100);
			printf(" . ");
		}
		Sleep(100);
		system("cls");
		printf("\n\r等待客户端的连接");
		a++;
	}
while(1)
{
	SOCKET s_d=accept(s,(sockaddr*)&addrClient,&len); //5、套接字等待连接::(服务器端) 
	if(s_d==INVALID_SOCKET) 
	{ 
	printf("套接字等待连接(服务器端)失败!\n");
	}	
	char *success="成功登陆服务器!";
	send(s_d,success,strlen(success)+1,0);            //向客户端发送验证信息

	char mess[M]; 
	nResult=recv(s_d,mess,strlen(mess),0); 
	if(nResult == -1 )                               //判断服务端是否关闭
	{
		printf("\n客户端已断开\n");
		system("pause");
		exit(0);
	}
	printf("\n%s",mess);

///////////////////////////////////////////////////////////////////////////
////                       功能菜单及操作                              ////
///////////////////////////////////////////////////////////////////////////
again:
	system("@color 0a");
	system("cls");
	puts("\n");
	puts("	  *********************************************************");
	puts("    	  *							  * ");
	puts("    	  *   欢·迎·使·用·局·域·网·文·件·发·送·工·具  *");
	puts("    	  *			(服   务   端)			  * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *	 	  1.向 客 户 端 传 送 文 件 		  * ");
	puts("    	  *							  * ");
	puts("    	  *		  2.向 客 户 端 发 起 聊 天		  * ");
	puts("    	  *							  * ");
	puts("    	  *		  3.结   束   服   务    端		  * ");
	puts("    	  *							  * ");
	puts("    	  *							  * ");
	puts("    	  *		      天乐软件工作室制作		  * ");
	puts("    	  *			  2008-3-1 			  * ");
	puts("    	  *		      版权所有★欢迎传播	  	  * ");
	puts("    	  *********************************************************\n");
	puts("全屏(退出全屏)操作请按:ALT+ENTER\n");
	printf("请输入你要选择的模块的代号(1-3):");
	char ch;
	char Num[10];
	gets(Num);
	ch=Num[0];
	while(ch >='4' || ch <='0')						//检测用户选择的代码是否符合要求
	{
		printf("\n你的输入有误!请重新输入:");
		gets(Num);
		ch=Num[0];
	}
 
	if('1'==ch)								    	//发送文件模块的处理
	{
		char ch;
		char *str="服务端向你传送文件,是否接受(Y/N):";
		send(s_d,str,strlen(str)+1,0);
		printf("等待客户端回应……\n");
		nResult=recv(s_d,&ch,sizeof(char),0);
		if(nResult == -1 )                         //判断客户端是否关闭
		{
			printf("\n客户端已断开\n");
			system("pause");
			goto again;
		}
		if( ch=='Y' || ch=='y')
		{	
			sendFile(s_d);
			goto again;
		}
		if(ch=='N'|| ch=='n')
		{
			printf("对方拒绝接受!\n");
			system("pause");
			goto again;
		}
	}

	if('2'==ch)									//处理聊天模块
	{
		char ch;
		int flag=0;
		char *str="服务端向你发起聊天,是否接受(Y/N):";
		send(s_d,str,strlen(str)+1,0);

		printf("等待客户端回应……\n");
	
		nResult=recv(s_d,&ch,sizeof(char),0);       //判断客户端同意或不同意
		if(nResult == -1 )                         //判断客户端是否关闭
		{
			printf("\n客户端已断开\n");
			system("pause");
			goto again;
		}
		if( ch=='Y' || ch=='y' )
		{	
			chatting_server(s_d);
			goto again;
		}
		if(ch=='N'|| ch=='n')
		{
			printf("对方拒绝接受!\n");
			system("pause");
			goto again;
		}
	}
	if('3'==ch)
	{
		exit(0);          //结束程序

⌨️ 快捷键说明

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