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

📄 server.c

📁 一个简单的p2p共享文件的程序
💻 C
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>#include <malloc.h>
////////structures and dates declare!////////////////
#define MSGMAX 100 #define BUFMAX 104 //buffer=head+msg
#define LGIN 1
#define ERROR 2
#define LRES 3 #define SHRE 4#define SHOK 5#define SRCH 6#define SRES 7#define QUIT 8int end=0;
struct Message 
{
      int head;
      unsigned char content[MSGMAX];     
};/////////functions/////////////////////////////void sendERROR(int client_sockfd,char * alert){	printf("Enter sendERROR\n");	struct Message snd;	unsigned char *buf2; //snd buffer!	buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	snd.head=ERROR;	strcpy(snd.content,alert);	printf("pop:%s\n",snd.content);	memset(buf2,'\0', BUFMAX);	buf2=(unsigned char *)&snd;	printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); 	end=1;};void dealwithSRCH(struct Message msg,int client_sockfd){	printf("Enter dealwithSRCH\n");	struct Message snd;	unsigned char *buf2; //snd buffer!	buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	char *search;	search=strtok(msg.content,"\n");	int i;	char filebuffer[1000];	char *result;	FILE *file;
	if((file=fopen("sharelist.txt","r+"))==NULL){
		printf("can not open file!\n");
		return;
	}	//build buffer for sharelist.txt  	memset(filebuffer,'\0',sizeof(filebuffer));	fseek(file,0L,SEEK_END); //set to the END	i=ftell(file);	fseek(file,0L,SEEK_SET); //set to the begin	i=fread(filebuffer,1,i,file);//read all !so hard way	fclose(file);	//filter the empty line!//	strtok(filebuffer,"\n");	//searching	result=strtok(filebuffer,"#");	while(result!=NULL){				if(strncmp(result,search,strlen(result))==0 || strcmp("txt",search)==0){			printf("find file\n");						//build snd msg!			memset(&snd,'\0',BUFMAX);			memset(buf2,'\0', BUFMAX);			snd.head=SRES;			strcpy(snd.content,result);//get filename			strcat(snd.content,"#");			result=strtok(NULL,"\n"); //get rest			strcat(snd.content,result);			strcat(snd.content,"\n");			result=strtok(NULL,"#");		//	printf("1.snd=%s\n",snd.content);			//send!			buf2=(unsigned char *)&snd;		//	printf("2.snd=%s\n",snd.content);			printf("send %d bytes,content is %s \n",write(client_sockfd, buf2, BUFMAX),snd.content); 		//	printf("3.snd=%s\n",snd.content);		}else{			strtok(NULL,"\n");			result=strtok(NULL,"#"); //point next		}//end if	}//end while	//snd eof	memset(&snd,'\0',BUFMAX);	memset(buf2,'\0', BUFMAX);	snd.head=SRES;	strcpy(snd.content,"\n");	buf2=(unsigned char *)&snd;	printf("2.snd=%s\n",snd.content);	printf("send %d bytes\n",write(client_sockfd, buf2, BUFMAX)); };void dealwithSHRE(struct Message msg,int client_sockfd,char * ip,char * user){	printf("Enter dealwithSHRE\n");	char *eachfile;	char *port;	char writetoshare[100];	char *contentbuffer;	FILE *file;	struct Message snd;	unsigned char *buf2; //snd buffer!	buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!	int flag=0;		//varify the format of file	printf("all is : %s",msg.content);	//filter the \n of msg.content! shit!	contentbuffer=strtok(msg.content,"\n");	port=strtok(contentbuffer,"#");	eachfile=strtok(NULL,"#");	while(eachfile!=NULL){		//printf("file:%s\n",eachfile);		printf("cmp:%d vs %d\n",strcspn(eachfile,".txt"),strlen(eachfile)-4);		if(strcspn(eachfile,".txt")!=strlen(eachfile)-4){			//got error format error!			sendERROR(client_sockfd,"error format\n");			return;		}		//save the share file 		if (flag==0){			strcpy(writetoshare,eachfile);			flag=1;		}else			strcat(writetoshare,eachfile);		strcat(writetoshare,"#");		strcat(writetoshare,user);		strcat(writetoshare,"#");		strcat(writetoshare,ip);		strcat(writetoshare,"#");		strcat(writetoshare,port);		strcat(writetoshare,"\n");		//printf("now:%s!!!\n",writetoshare);		eachfile=strtok(NULL,"#");	}	//save the share file information to sharelist.txt	if((file=fopen("sharelist.txt","a+"))==NULL){
		printf("can not open file:sharelist.txt\n");
		return;
	}	printf("write=%s",writetoshare);	fwrite(writetoshare,1,strlen(writetoshare),file);//copy to file	fclose(file);	//respone 	snd.head=SHOK;	strcpy(snd.content,"\n");	memset(buf2,'\0', BUFMAX);	buf2=(unsigned char *)&snd;	printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); };void dealwithLGIN(struct Message msg,int client_sockfd,char * u){	printf("Enter dealwithLGIN\n");	char *username;	username=(char *)malloc(20);	char *password;//temp	char realpwd[50];//password had been decode 	char userlist[1000]; // buffer for userlist	char usrpwd[50],*splits="#";//temp	int i;//temp	char *onematch;//temp		struct Message snd;	unsigned char *buf2; //snd buffer!	buf2=(unsigned char *)malloc(BUFMAX); //dynamic alloc mem!!!!so fucking!		username=strtok(msg.content,"#"); //get username
	password=strtok(NULL,"\n");//get pwd
	//decrypt password	printf("u:%s,p:%s\n",username,password);
	for(i=1;i<strlen(password);i++)
		realpwd[i-1]=password[i]+password[0]-'0';	//check the identity form database(userlist.txt)
	FILE *file;
	if((file=fopen("userlist.txt","r+"))==NULL){
		printf("can not open file!\n");
		return;
	}	//generate search string	strcpy(usrpwd,username);			strcat(usrpwd,splits);	strcat(usrpwd,realpwd);	//build buffer for userlist.txt  	memset(userlist,'\0',sizeof(userlist));	fseek(file,0L,SEEK_END); //set to the END	i=ftell(file);	fseek(file,0L,SEEK_SET); //set to the begin	i=fread(userlist,1,i,file);//read all !so hard way	fclose(file);	///////test///////////////////////////////////////////////////	/*printf("userpwd:%s\n",usrpwd); //test	printf("%s\n",userlist); //test	printf("%d\n",i); //test*/	//search and match	onematch=strtok(userlist,"\n");	while(onematch!=NULL){		//printf("onematch:%s;usrpwd:%s\n",onematch,usrpwd);		if(strncmp(onematch,usrpwd,strlen(onematch))==0){			printf("find\n");			snd.head=LRES;			strcpy(snd.content,"log in succuss\n");			memset(buf2,'\0', BUFMAX);			buf2=(unsigned char *)&snd;			printf("send %d bytes \n",write(client_sockfd, buf2, BUFMAX)); 			strcpy(u,username);			printf("in user:%s\n",username);			return ;			}		onematch=strtok(NULL,"\n");	}	//not find send error	sendERROR(client_sockfd,"invalid log in");		return ;};
int main()
{
	int server_sockfd, client_sockfd;
	struct sockaddr_in server_addr, client_addr;
	socklen_t client_len;//size of client_addr
	unsigned char buf[BUFMAX];//rcv buffer
    	struct Message msg;//the package rcv	pid_t pid;	char username[20];//log in sucuss username		client_len = sizeof(client_addr);	//set the server addr
	bzero((char *)&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//get my ip add
	server_addr.sin_port = htons(8092);
	//create socket  SOCK_STREAM for TCP
	if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("create server socket error");
	}
	// bind socket with my ip 
	if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
		perror("bind server socket error");
	}
	//listen and create connection,at most 5 connections
	if (listen(server_sockfd, 5) < 0) {
		perror("listen server socket error");
	}
	
	printf("<BEGIN>\n");

	for (;;) {
		printf("Waiting for connect...\n");
		//get client sock		client_len=sizeof(client_addr);
		client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_len);		////////////////fork////////////////////		pid=fork();		if(pid>0){}		else if(pid==0){		/////////////end fork//////////////////////		printf("client ip:%s,sockfd:%d\n",inet_ntoa(client_addr.sin_addr.s_addr),client_sockfd);
		while(1){			//read & write
        		memset(&msg,'\0', sizeof(&msg));			memset(buf,'\0', sizeof(buf));			//so important!!!!! must use the unsigned buffer			read(client_sockfd, buf, sizeof(buf));			msg=*(struct Message *)buf;
            		//	printf("recive request %d,%s\n", msg.head,msg.content); //test 
              		if(msg.head==LGIN){				memset(&username,'\0',20);
				dealwithLGIN(msg,client_sockfd,&username);				//printf("name:%s\n",username);				break;			}		}//end while		if(username[0]!='\0'){//log in sucuss			while(1){				//read & write
        			memset(&msg,'\0', sizeof(&msg));				memset(buf,'\0', sizeof(buf));				//so important!!!!! must use the unsigned buffer				read(client_sockfd, buf, sizeof(buf));				msg=*(struct Message *)buf;				if(msg.head==SHRE){//deal with share file					//printf("begin share\n");					dealwithSHRE(msg,client_sockfd,inet_ntoa(client_addr.sin_addr.s_addr),username);
             			}else if (msg.head==SRCH){					dealwithSRCH(msg,client_sockfd);				}else if(msg.head==QUIT){					printf("byebye:%s\n",username);					break;				}			}//end while		}		close(client_sockfd); 		/////////////////////////fork//////////////		}else{ perror("fork error");}		//return 0;          
	}
    
    return 0;
}

⌨️ 快捷键说明

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