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

区块链

581人已加入

描述

#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


客户端:

#include #include #include #include #include #include #include #include #include #include #define MAXLINE 512 #define NAMELEN 20 #define PORT 8080 int sockfd; //发送消息的函数snd void snd() { char name[NAMELEN]; char buff[MAXLINE]; gets(name); write(sockfd,name,strlen(name)); while(1) { gets(buff); write(sockfd,buff,strlen(buff)); if(strcmp("bye",buff)==0) { exit(0); } } } int main(int argc,char **argv) { pthread_t thread; struct sockaddr_in servaddr; if(argc != 2) { printf("usage: echo ip\n"); return -1; } //调用socket函数创建客户端的套接字 sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { printf("Socket create failed\n"); return -1; } //初始化服务器端的地址 servaddr.sin_family=AF_INET; servaddr.sin_port=htons(PORT); if(inet_aton(argv[1],&servaddr.sin_addr)<0) { printf("inet_aton error.\n"); return -1; } //调用connect函数实现与服务器端建立连接 printf("Connecting...\n"); if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0) { printf("Connect server failed.\n"); return -1; } //从此处开始程序分做两个线程 //创建发送消息的线程,调用了发送消息的函数snd pthread_create(&thread,NULL,(void*)(&snd),NULL); //从此处开始向下为接收消息的线程 char buff[MAXLINE]; int len; while(1) { if((len=read(sockfd,buff,MAXLINE))>0) { buff[len]=0; printf("\n%s\n\n",buff); } } return 0; }


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分