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

📄 server.c

📁 linux下开发的一款类似于QQ的网络聊天室
💻 C
字号:
#include "main.h"#define MAX 1024#define T_MAX 20short int port=8080;node *head;void thread(node *p){	FILE *fp;	int i,n,socket;	char name[50];	int flag=0;	char buff[MAX];	char mesg[MAX];	char Mesg[MAX];	char out[100];	char s[50],f[50];	char *q,*r,*t;	node *ptr;	socket=p->sockfd;	while(1)	{		memset(buff,0,sizeof(buff));		n=read(socket,buff,MAX);		if(n<=0)			break;		if((q=strchr(buff,'\n'))!=NULL)			*q='\0';		printf("received from client :%s\n",buff);		if(flag==0){			q=strstr(buff,"REGIST");			if(q!=NULL)			{				q=strchr(buff,':');				if(q!=NULL)					q++;				r=strchr(q,':');				if(r!=NULL)					*r='\0';				r++;				n=regist(q,r);				if(n==0)				{					strcpy(s,"regist sucsess!");					send(socket,s,strlen(s),0);					del(head,socket);					pthread_exit(NULL);				}				if(n==-1)				{					strcpy(f,"regsit failed,please retry!");					send(socket,f,strlen(f),0);					continue;				}			}			else 			{				q=strstr(buff,"LOGIN");				if(q!=NULL)				{					q=strchr(buff,':');					if(q!=NULL)						q++;					r=strchr(q,':');					if(r!=NULL)						*r='\0';					r++;					n=login(q,r);					if(n==0)					{						strcpy(out,q);						strcpy(s,"login sucsess!welcome!\n");						flag=1;						send(socket,s,strlen(s),0);						ptr=head->next;						while(ptr!=NULL)						{							if(ptr->sockfd==socket)							{								strcpy(ptr->user_name,q);								strcpy(name,q);								break;							}							else								ptr=ptr->next;						}						strcat(q,":login chating room!\n");						group(head,q);					}					else					{						del(head,socket);						pthread_exit(NULL);					}				}				else{					help(socket);				}			}		}		if(flag==1)		{			if(strcmp(buff,"RECORD")==0)			{				fp=fopen(name,"r");				if(fp==NULL)				{					perror("open");					continue;				}				memset(mesg,0,sizeof(mesg));				while(fgets(mesg,sizeof(mesg),fp)!=NULL)				{					send(socket,mesg,strlen(mesg),0);				}							}			else if(strcmp(buff,"SHOW")==0)				showuser(head,socket);			else if(strcmp(buff,"HELP")==0)			{					help(socket);			}			else			{				q=strchr(buff,':');				if(q==NULL)					help(socket);				else{					r=q+1;					*q='\0';					if(strcmp(buff,"ALL")==0)					{						memset(mesg,0,sizeof(mesg));						strcat(mesg,name);						strcat(mesg," to ALL:");						strcat(mesg,r);						strcat(mesg,"\n");						group(head,mesg);						if((fp=fopen(name,"a+"))==NULL)						{							perror("open");							pthread_exit(NULL);						}						fputs(mesg,fp);						fclose(fp);					}					else if(strcmp(buff,"TO")==0)					{						q=strchr(r,':');						t=q+1;						*q='\0';						memset(mesg,0,sizeof(mesg));						strcat(mesg,name);						strcat(mesg,":");						strcat(mesg,t);						strcat(mesg,"\n");						single(head,r,mesg);						if((fp=fopen(name,"a+"))==NULL)						{							perror("open");							pthread_exit(NULL);						}						memset(mesg,0,sizeof(mesg));						strcat(mesg,"TO ");						strcat(mesg,r);						strcat(mesg," :");						strcat(mesg,t);						strcat(mesg,"\n");						fputs(mesg,fp);						fclose(fp);					}					else						help(socket);				}			}		}	}	if(flag==1)	{		strcat(out,":logout chating room!\n");		group(head,out);	}	del(head,socket);	pthread_exit(NULL);}int main(){	struct sockaddr_in sin;	struct sockaddr_in pin;	int listen_fd;	int conn_fd;	socklen_t address_size=sizeof(pin);	char str[INET_ADDRSTRLEN];	int i=0;	int len;	int ret;	int n;	node *ptr;	pthread_t tid[T_MAX];	signal(SIGPIPE,SIG_IGN);	signal(SIGCHLD,SIG_IGN);	head=(node *)malloc(sizeof(node));	head->sockfd=0;	head->next=NULL;	strcpy(head->user_name,"admin");	bzero(&sin,sizeof(sin));	sin.sin_family=AF_INET;	sin.sin_addr.s_addr=INADDR_ANY;	sin.sin_port=htons(port);	listen_fd=socket(AF_INET,SOCK_STREAM,0);	{		int opt=1;		setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));	}	ret=bind(listen_fd,(struct sockaddr *)&sin,sizeof(sin));	if(ret<0){		perror("bind");		exit(1);	}	listen(listen_fd,T_MAX);	printf("accepting connections......\n");	while(1){		conn_fd=accept(listen_fd,(struct sockaddr *)&pin,&address_size);		ptr=(node *)malloc(sizeof(node));		ptr->sockfd=conn_fd;		strcpy(ptr->user_name,"unname");		ptr->next=NULL;		insert(head,ptr);		pthread_create(&tid[i],NULL,(void*)thread,ptr);		i++;	}}

⌨️ 快捷键说明

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