基于TCP的select的聊天室

服务器:

#include<myhead.h>#define PORT 9999
#define IP "192.168.125.130"struct Msg
{char type;char name[20];char text[100];
};
struct sock
{int fd;struct sockaddr_in cin;
};int main(int argc, const char *argv[])
{if(argc != 3){printf("输入有误请重新输入\n");printf("./a.out IP PORT\n");return -1;}int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error");return -1;}//设置快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}//创建绑定结构体struct sockaddr_in sin;sin.sin_family = AF_INET;//sin.sin_port = htons(PORT);sin.sin_port = htons(atoi(argv[2]));//sin.sin_addr.s_addr = inet_addr(IP);sin.sin_addr.s_addr = inet_addr(argv[1]);//绑定地址信息结构体if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");//设置为监听状态if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;socklen_t socklen = sizeof(cin);fd_set readfds;//读文件描述符集合//清空集合FD_ZERO(&readfds);//文件描述符加入集合FD_SET(0,&readfds);FD_SET(sfd,&readfds);int maxfd = sfd;int newfd = -1;int res = -1;char buf[128] ="";fd_set tempfds;struct sock arr_cin[1024];//成员信息结构体数组struct Msg peo;//接受客户端发来的结构体while(1){tempfds = readfds;//判断产生的事件res = select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){printf("time out\n");return -1;}//判断事件for(int i=0;i<=maxfd;i++){if(!FD_ISSET(i,&tempfds)){continue;}//发生事件的文件描述符if(i == sfd){//设置为接收状态if((newfd = accept(sfd,(struct sockaddr*)&cin,&socklen)) == -1){perror("accept error");return -1;}arr_cin[newfd].cin = cin;arr_cin[newfd].fd = newfd;printf("[%s:%d] 连接成功, newfd = %d\n", inet_ntoa(arr_cin[newfd].cin.sin_addr),\ntohs(arr_cin[newfd].cin.sin_port), newfd); //将新加入的客户端加入数组FD_SET(newfd,&readfds);if(newfd > maxfd){maxfd = newfd;}}else if(i == 0){peo.type = 'c';bzero(peo.text,sizeof(peo.text));fgets(peo.text,sizeof(peo.text),stdin);peo.text[strlen(peo.text)-1]=0;strcpy(peo.name,"系统");//发送给全部客服端for(int index=4;index<=maxfd&&FD_ISSET(index,&readfds);index++){send(index,&peo,sizeof(peo),0);}}else{//接受客户端发来的消息,并发送给其他人bzero(&peo,sizeof(peo));res = recv(i,&peo,sizeof(peo),0);if(res == 0){printf("客户端下线\n");close(i);FD_CLR(i,&readfds);for(int i=maxfd;i>0;i--){if(FD_ISSET(i,&readfds)){maxfd = i;break;}}continue;}if(peo.type == 'L'){sprintf(peo.text,"-----%s上线-------",peo.name);for(int index = 4;index<=maxfd&&FD_ISSET(index,&readfds);index++){if( i== arr_cin[index].fd )continue;send(index,&peo,sizeof(peo),0);}}else if(peo.type == 'c'){for(int index = 4;index<=maxfd&&FD_ISSET(index,&readfds);index++){if( i != arr_cin[index].fd ){printf("%s:%s\n",peo.name,peo.text);//测试send(arr_cin[index].fd,&peo,sizeof(peo),0);}}}else if(peo.type == 'Q'){sprintf(peo.text,"-----%s下线-------",peo.name);for(int index = 4;index<=maxfd&&FD_ISSET(index,&readfds);index++){if( i== arr_cin[index].fd )continue;send(index,&peo,sizeof(peo),0);}close(i);FD_CLR(i,&readfds);for(int i=maxfd;i>0;i--){if(FD_ISSET(i,&readfds)){maxfd = i;break;}}continue;}}}}close(sfd);return 0;
}

客户端:

#include<myhead.h>#define PORT 9999
#define IP "192.168.125.130"struct Msg
{char type;char name[20];char text[100];
};int main(int argc, const char *argv[])
{if(argc != 3){printf("输入有误请重新输入\n");printf("./a.out IP PORT\n");return -1;}int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket error");return -1;}//设置快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}//链接struct sockaddr_in sin;sin.sin_family = AF_INET;//sin.sin_port = htons(PORT);//sin.sin_addr.s_addr = inet_addr(IP);sin.sin_port = htons(atoi(argv[2]));sin.sin_addr.s_addr = inet_addr(argv[1]);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("connect error");return -1;}printf("connect success\n");//将成员信息发送给服务器struct Msg information;printf("请输入姓名>>>");scanf("%s",information.name);getchar();information.type = 'L';strcpy(information.text, " ");printf("-----%s登陆成功-----\n",information.name);send(sfd,&information,sizeof(information),0);fd_set readfds;FD_SET(0,&readfds);FD_SET(sfd,&readfds);int maxfd = sfd;int res = -1;char buf[128] ="";fd_set tempfds;while(1){tempfds = readfds;res = select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){printf("time out\n");return -1;}//到此发生事件if(FD_ISSET(0,&tempfds)){struct Msg mem;mem.type = 'c';//设置类型strcpy(mem.name,information.name);//复制名字//客户端消息发送个服务器,服务器发送给其他客户端bzero(mem.text,sizeof(mem.text));fgets(mem.text,sizeof(mem.text),stdin);mem.text[strlen(mem.text)-1]=0;if(strcmp(mem.text,"quit") == 0){mem.type = 'Q';send(sfd,&mem,sizeof(mem),0);break;}send(sfd,&mem,sizeof(mem),0);}else{struct Msg mem;//接收服务器发来的消息bzero(&mem,sizeof(mem));res = recv(sfd,&mem,sizeof(mem),0);if(res == 0){printf("客户端下线\n");break;}else if(res == -1){perror("recv");return -1;}if(mem.type == 'L'||mem.type == 'Q'){	printf("%s\n",mem.text);}elseprintf("%s:%s\n",mem.name,mem.text);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios弧形进度条_iOS如何实现环形进度条加载效果

绘制方法需要重写- (void)drawRect:(CGRect)rect&#xff0c;使用UIBezierPath绘制圆形动画路径&#xff0c;调用stroke进行绘制&#xff0c;如下&#xff1a;- (void)drawRect:(CGRect)rect{UIBezierPath *path [[UIBezierPath alloc] init];path.lineWidth 10.0;[[UIColor …

唯品会:在 Flink 容器化与平台化上的建设实践

简介&#xff1a; 唯品会 Flink 的容器化实践应用&#xff0c;Flink SQL 平台化建设&#xff0c;以及在实时数仓和实验平台上的应用案例。 转自dbaplus社群公众号 作者&#xff1a;王康&#xff0c;唯品会数据平台高级开发工程师 自 2017 年起&#xff0c;为保障内部业务在平…

android system.img编译,快速编译system.img和boot.img的方法

快速编译system.img&#xff0c;可以使用这个命令&#xff1a;#make systemimage快速编译boot.img&#xff0c;可以使用以下命令:#make bootimage快速编译userdata.img&#xff0c;可以使用以下命令:# make userdataimage-nodeps但是&#xff0c;对于bootimage, 在不改变内存布…

python怎么变成exe_Python怎样打包成exe?

分类&#xff1a;Python &#xff5c; 作者&#xff1a;凹凸曼 &#xff5c; 发表于2011/03/01Python怎样打包成exe&#xff1f;已关闭评论 发现PyInstaller 是个不错的东东&#xff0c;解决打包单个exe的问题&#xff0c;使用非常简单&#xff0c;不用编写setup脚本&#xff1…

PolarDB-X 2.0:使用一个透明的分布式数据库是一种什么体验

简介&#xff1a; 透明分布式&#xff0c;是PolarDB-X即将发布的能力&#xff0c;它能让应用在使用PolarDB-X的过程中&#xff0c;犹如使用单机数据库一般的体验。与传统的中间件类型的“分布式数据库”相比&#xff0c;有了透明分布式能力的PolarDB-X&#xff0c;不再需要应用…

larvel php restful_laravel 实现一个简单的 RESTful API

创建一个 Article 资源php artisan make:resourceArticle你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源当然我们还需要 Article 的数据库迁移、模型和控制器。我们能用这个命令快速的创建这些。创建相关的model和contrlloerphp artisan make:model Models/…

Chrome 96 又更新了 5 个巨巨巨好用的功能

作者 | 零一来源 | 前端印象‍‍‍‍‍‍‍大家好&#xff0c;收到了 Chrome 96 版本的更新推送&#xff0c;简单看了一下&#xff0c;还是更新了几个挺有趣的东西的&#xff0c;一起来看看到底都有啥~先下载 Chrome Beta 版本才能体验 Chrome 96 哈Chrome Beta我们顺便来给每个…

Android手机产线测试模块,基于Android平台智能手机可靠性生产测试模式的实现

摘要&#xff1a;随着通信技术的飞速发展,智能手机逐渐走进了普通大众的生活,未来它将成为人们获取信息的主要设备,这是一个不可阻挡的趋势.依托中国3G业务的发展,移动手机市场近几年来发展火爆全面智能化.但在我国手机市场上,国外知名品牌的市场份额在一半以上,国内品牌手机的…

编译优化 | LLVM代码生成技术详解及在数据库中的应用

简介&#xff1a; 作者&#xff1a;长别 1. 前言 随着IT基础设施的发展&#xff0c;现代的数据处理系统需要处理更多的数据、支持更为复杂的算法。数据量的增长和算法的复杂化&#xff0c;为数据分析系统带来了严峻的性能挑战。近年来&#xff0c;我们可以在数据库、大数据系…

低代码发展专访系列之二:两三年内会出现“现象级”低代码产品吗?

前言&#xff1a;2019年开始&#xff0c;低代码爆火。有人认为它是第四代编程语言&#xff0c;有人认为它是开发模式的颠覆&#xff0c;也有人认为是企业管理模式的变革……有很多声音&#xff0c;社区讨论很热烈。CSDN 随后展开低代码平台产品系列活动&#xff0c;包括低代码开…

mssql 数据库审计账户_SQLServer数据库审计功能入门之SQL Server审核 (SQL Server Audit)...

本文主要向大家介绍了SQLServer数据库审计功能入门之SQL Server审核&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习SQLServer数据库有所帮助。介绍Audit是SQL Server 2008之后才有的功能&#xff0c;它能告诉你“谁什么时候做了什么事情”。具体是指审核SQL …

为什么Spring仍然会是云原生时代最佳平台之一?

简介&#xff1a; 基于Java语言的Spring生态&#xff0c;还能否适应新的开发方式&#xff0c;比如Cloud Native、Serverless、Faas等&#xff0c;它还会是云原生时代的最佳平台的选择吗&#xff1f;本文将从5个角度来为你分析一下这个问题&#xff0c;分别是&#xff1a;Java和…

贾又福大象鸿蒙,奏乐!继续吹!库里又创记录,射进MVP榜单,众多名记变“库吹“...

库里本月已投进85记三分 打破哈登保持的NBA单月三分命中数纪录加上今天的7记三分&#xff0c;库里本月已经投进85记三分&#xff0c;创造了新的NBA单月(自然月)三分命中数纪录。勇士本月还有两场比赛。此前&#xff0c;哈登曾单月82记三分。在NBA历史单月三分球命中数前三榜单中…

opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析

点击上方蓝字关注我们微信公众号&#xff1a;OpenCV学堂关注获取更多计算机视觉与深度学习知识前言图像/视频拼接的主要目的是为了解决相机视野(FOV-Field Of View)限制&#xff0c;生成更宽的FOV图像/视频场景。视频拼接在体育直播、全景显示、数字娱乐、视频处理中都被广泛应…

数字化让618有了洞悉消费者内心的“大脑”

简介&#xff1a; 阿里云数据中台已形成包括会员智能运营、全域天攻智投、GMV策略模拟等在内的近10套解决方案&#xff0c;围绕“人”“货”“场”三大零售行业要素&#xff0c;逐个击破品牌业务难点&#xff0c;记者了解到&#xff0c;过去一年&#xff0c;悦诗风吟、Benefit、…

赋能工业互联网融合发展 | 北京信息化和工业化融合服务联盟平台化设计专业委员会、中国仿真学会CAE仿真专业委员会成立

11月28日&#xff0c;由北京市经济和信息化局指导&#xff0c;北京信息化和工业化融合服务联盟与中国仿真学会共同主办&#xff0c;联盟平台化设计专业委员会、中国仿真学会CAE仿真专业委员会、国家数字化设计与制造创新中心北京中心、北京数字化设计与制造产业创新中心共同承办…

升级鸿蒙系统有没有翻车,被寄予厚望的华为鸿蒙系统,这次要翻车?原来并不是我们想的那样...

华为鸿蒙系统早在去年就已经被正式发布&#xff0c;但那时的人们对这个操作系统还不熟悉。但近期华为又在其发布会上发布了鸿蒙OS2.0&#xff0c;并表示到了2021年华为手机将全面使用鸿蒙2.0。这消息一出&#xff0c;不少华为用户忍不住想去尝尝鲜&#xff0c;纷纷都将系统更新…

PolarDB-X 2.0 全局 Binlog 和备份恢复能力解读

简介&#xff1a; PolarDB-X 2.0 针对数据孤岛问题提供了全局 Binlog 能力&#xff0c;该能力为下游生态提供了与 MySQL Binlog 完全一致的增量日志消费体验。针对数据损坏问题提供了实例级、表级、SQL 级和行级等不同粒度的数据恢复能力&#xff0c;包括一致性备份恢复、表回收…

友盟+《小程序用户增长白皮书》:从五个角度入手分析小程序数据

简介&#xff1a; 近日&#xff0c;国内领先的全域数据智能服务商——友盟&#xff0c;发布了《友盟U-APM 移动应用性能体验报告》。据悉&#xff0c;友盟于去年将原移动分析U-App错误分析模块正式升级为U-APM应用性能监控平台&#xff0c;经过近一年的观察&#xff0c;通过DEM…

双向板受力特点_双向板的受力特点与试验结果

长跨的挠度曲线弯曲最大处不在跨中而在离板边约21短跨长处。(2)加载过程中&#xff0c;在裂缝出现之前&#xff0c;双向板基本上处于弹性工作阶段。(3)四边简支的正方形或矩形双向板&#xff0c;当荷载作用时&#xff0c;板的四角有翘起的趋势&#xff0c;因此板传给四边支座的…