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

📄 server.c

📁 计算机网络编程
💻 C
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include<pthread.h>
#define BUFMAX 100
int server_sockfd, client_sockfd;
struct sockaddr_in server_addr, client_addr;
int client_len;
char buf[BUFMAX];
int buflen;
int total=0;
int store=5;
char name[20];
char pwd[20];
char username[BUFMAX][20];
char password[BUFMAX][20];
char storename[20][20]={"admin","zhouyuan","a","b"};
char storepwd[20][20]={"admin","111","a","b"}; 
char file[BUFMAX][BUFMAX];
char port[BUFMAX][BUFMAX];
char ip[BUFMAX][BUFMAX]={{0},{0}};
char buf1[BUFMAX];
char buf3[BUFMAX];
char buf4[BUFMAX];
int len1;
int len2;
char temp[BUFMAX];
char *ptr1,*ptr2,*ptr;
int g,i;
char *addrIP;
char portnumber[50];
char *search="#";
int markfile=1;
char arr[20];
char *find;
pid_t pid;
//多线程登陆服务器  
int thread(void)
{
    addrIP=inet_ntoa(client_addr.sin_addr);  
	for (;;) 
	{
		memset(buf1, '\0', sizeof(buf1));
		memset(buf3, '\0', sizeof(buf3));
		memset(buf, '\0', sizeof(buf));
		int count=0;
		buflen=read(client_sockfd, buf, BUFMAX);
		printf("hello say: %s\n", buf);
		strncpy(buf3,buf, 4);
		//处理登陆验证用户名和密码 
		if((buf3[0]=='L')&&(buf3[1]=='G')&&(buf3[2]=='I')&&(buf3[3]=='N'))
		{
			memset(pwd, '\0', sizeof(pwd));
			memset(name, '\0', sizeof(name));
			char *str="LRESWelcome Login!\n";
			ptr1=strstr(buf,"N");
			ptr1=ptr1+1;
			len1=strlen(ptr1);
			ptr2=strstr(ptr1,"#");
			len2=strlen(ptr2);
			strncpy(name,ptr1,len1-len2);
			strncpy(pwd,ptr2+1,len2-1);
			//解码 
			int val=pwd[0]-'0';
			for(i=1;i<strlen(pwd)-1;i++)
			{ pwd[i-1]=pwd[i]+val;}
			i=i-1;
			pwd[i]='\0';
			int m=0;
			for(i=0;i<store;i++)
			{
				if(strcmp(name,storename[i])==0&&strcmp(pwd,storepwd[i])==0)
				{
					m=1; break;}
				
			}
			if(m)
			{ 
				buflen = strlen(str); 
				write(client_sockfd, str, BUFMAX); 
			}
			else{
				str="EROR用户名或密码输入错误\n";
				write(client_sockfd, str, BUFMAX); 
				break;
			}
		}
		//处理传来的分享文件判断.txt文件,如果全为txt文件,存到file[][]数组里,全局变量增加1。
		//将usename[][]和ip[][]和port[][],分别存储。
		else if((buf3[0]=='S')&&(buf3[1]=='H')&&(buf3[2]=='R')&&(buf3[3]=='E'))
		{
			memset(portnumber, '\0', sizeof(portnumber));
			markfile=1;
			char*a;
			char *b=&buf3[3];
			a=strstr(buf,b);   
			a=a+1;
			len1=strlen(a);
			b=strstr(a,"#");
			len2=strlen(b);
			for(g=0;g<strlen(buf);g++)
			{
				if(buf[g]=='#')
					count++;
			}
			strncpy(portnumber,a,len1-len2);
			a=b;
			char *c=a;
			for(g=1;g<=count;g++)
			{
				a=a+1;
				len1=strlen(a);
				if(g!=count)
				{
					b=strstr(a,"#");
					len2=strlen(b);
				}
				else
					len2=1;
				int j=0;
				for(i=len1-len2-3;i<len1-len2;i++)
				{
					temp[j]=a[i];
					j++;
					
				}
				if(strcmp(temp,"txt")!=0)
				{
					char *str="EROR注意传递.txt文件\n";
					buflen=strlen(str);
					markfile=0;
					write(client_sockfd, str,buflen); 
					break;
				}
				a=b;
			}
			if(markfile)
			{
				total=total+1;
				memset(username[total], '\0', sizeof(username[total]));
				memset(password[total], '\0', sizeof(password[total]));    
				memset(ip[total], '\0', sizeof(ip[total]));
				memset(port[total], '\0', sizeof(port[total]));
				char *str="SHOK\n";
				write(client_sockfd, str, BUFMAX);
				len1=strlen(c);
				strncpy(file[total],c,len1-1);
				strcpy(ip[total],addrIP);
				strcpy(port[total],portnumber);
				strcpy(username[total],name);
				strcpy(password[total],pwd);
				printf("%s",file[total]);
				printf("%d\n",total);
			}
		}
	   //处理搜索文件功能,找到所有的文件,依次匹配,如果部分匹配,则传给client
		else if((buf3[0]=='S')&&(buf3[1]=='R')&&(buf3[2]=='C')&&(buf3[3]=='H'))
		{
			char*a;
			char filename[BUFMAX];
			memset(filename, '\0', sizeof(filename));
			char *b=&buf3[3];
			a=strstr(buf,b);  
			a=a+1;
			char *str="SRES";
			strcpy(filename,a);
			for(i=1;i<=total;i++)
			{//文件名匹配 
				ptr=strstr(file[i],"#");
				while(ptr)
				{
					memset(arr,'\0',sizeof(arr));
					memset(buf1, '\0', sizeof(buf1));
					len1=strlen(ptr);
					ptr=ptr+1;
					ptr1=strstr(ptr,"#");
					if(ptr1){
						len2=strlen(ptr1);}
					else len2=0;
					strncpy(arr,ptr,len1-len2-1);
					find=strstr(arr,filename);
					if(find)
					{
					strcat(buf1,str);
					strcat(buf1,arr);
					strcat(buf1,"#");
					strcat(buf1,username[i]);
					strcat(buf1,"#");
					strcat(buf1,ip[i]);
					strcat(buf1,"#");
					strcat(buf1,port[i]);
					strcat(buf1,"#");
					strcat(buf1,"\n");
					printf("%s\n",buf1);
					write(client_sockfd, buf1, BUFMAX);
						printf("%s\n",arr);
					}
					ptr=ptr1;
				}
				
			}
			char *tr="SRES\n";//文件查找结束 
			write(client_sockfd, tr, BUFMAX);
			
		}//处理客户端传来的quit指令
		else if((buf3[0]=='Q')&&(buf3[1]=='U')&&(buf3[2]=='I')&&(buf3[3]=='T'))
		{
		  	close(client_sockfd);
			break;
		}
	}
	return 0;
}


int main()
{
	pthread_t id;  
	memset(temp, '\0', sizeof(temp));
	//建立server socket
	bzero((char *)&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(8000115);
	if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("create server socket error");
	}
	//绑定server端socket
	if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
		perror("bind server socket error");
	}
	
	if (listen(server_sockfd, 5) < 0) {
		perror("listen server socket error");
	}
	
	printf("Welcome, world!\n");
	
	for (;;) 
	{
		client_len = sizeof(client_addr);
		printf("Waiting for hello...\n");
		client_sockfd =accept(server_sockfd, (struct sockaddr *)&client_addr, &client_len);
		int i,ret;        ret=pthread_create(&id,NULL,(int*) thread,NULL);//多线程
        if(ret!=0){
			printf ("Create pthread error!\n");
			exit (1);
		}	
	//	pthread_join(id,NULL);

	}
	close(client_sockfd);	
    return 0;
}

⌨️ 快捷键说明

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