当前位置:诺佳网 > 电子/半导体 > 区块链 >

模拟QQ聊天室(线程并发)

时间:2018-01-13 | 栏目:区块链 | 点击:

#include #include #include #include #include #include #include #include #include #include #define LISTENQ 1000 //最大连接数 #define MAXLINE 512 //发送消息的最长字节 #define MAXMEM 1000 #define NAMELEN 20 //名字长度 struct socketcfd { char name[20]; int fd; }; int listenfd; //分别记录服务器端的套接字与连接的多个客户端的套接字 struct socketcfd connfd[MAXMEM]; void rcv_snd(void *arg) //服务器接受并转发消息函数 { char* ask="请输入你的名字:"; char* ask1="使用说明:\n1、群聊可以直接发送消息,\n2、私聊请先输入@+人名+空格+内容,\n3、退出直接输入“bye”\n-------------------------------------------"; char* ch="此用户不存在"; char* ch1="群聊"; char* ch2="私聊"; char buff[MAXLINE]; //用户姓名 char buff1[MAXLINE]; //聊天内容(包括私聊和群聊,然后对它进行分析) char buff2[MAXLINE]; //发送消息的时间 char buff3[MAXLINE]; //私聊时接受用户的姓名 char buff4[MAXLINE]; //私聊时发送的内容 time_t ticks; int i=0; int retval; int len; int k=0,j=0,m=0; int p; int n=(int *)arg; //获取此进程对应的套接字用户的名字 write(connfd[n].fd,ask,strlen(ask)); len=read(connfd[n].fd,connfd[n].name,NAMELEN); if(len>0){ connfd[n].name[len]=0; } printf("用户姓名:%s\n",connfd[n].name); //把当前用户的加入告知所有用户 strcpy(buff,connfd[n].name); strcat(buff,"\t加入聊天"); for(i=0;i0) { buff1[len]=0; //当前用户的输入信息为“bye”时,当前用户退出 if(strcmp("bye",buff1)==0){ printf("%s用户已退出\n",connfd[n].name); close(connfd[n].fd); connfd[n].fd=-1; pthread_exit(&retval); } //通过分析发送的信息判断是群聊还是私聊 if(buff1[0]=='@'){ j=0;m=0; for(k=1;kp){ buff4[m]=buff1[i]; m++; } else if(iMAXMEM){ write(connfd[n].fd,ch,strlen(ch)); } } }else{ ticks=time(NULL); sprintf(buff2,"%.24s\r\n",ctime(&ticks)); strcpy(buff,buff2); strcat(buff,ch1); strcat(buff,"\t"); strcat(buff,connfd[n].name); strcat(buff,"\n"); strcat(buff,buff1); for(i=0;i


客户端:

您可能感兴趣的文章:

相关文章