TCP的poll多路复用实现群聊

 服务器

#include <myhead.h>
#define SERIP "192.168.125.99"
#define SERPORT 9999
int main(int argc, const char *argv[])
{int sfd=-1;if((sfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);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(SERPORT);sin.sin_addr.s_addr=inet_addr(SERIP);struct sockaddr_in cin;socklen_t socklen=sizeof(cin);struct sockaddr_in newsin[1024];char name[1024][128];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");int res=-1;char rbuf[128]="";char wbuf[128]="";struct pollfd fds[1024];for(int i=0;i<1024;i++){fds[i].fd=-1;fds[i].events=POLLIN;}fds[0].fd=0;fds[0].events=POLLIN;//insert_rear("服务器输入",head);fds[3].fd=sfd;fds[3].events=POLLIN;//insert_rear("连接用",head);while(1){res=poll(fds,1024,-1);if(res<0){perror("poll error");return -1;}else if(res==0){printf("time out\n");return -1;}if(fds[0].revents==POLLIN){bzero(rbuf,sizeof(rbuf));bzero(wbuf,sizeof(wbuf));fgets(rbuf,sizeof(rbuf),stdin);rbuf[strlen(rbuf)-1]=0;strcat(wbuf,"服务器: ");strcat(wbuf,rbuf);strcpy(rbuf,wbuf);for(int i=4;i<1024;i++){send(fds[i].fd,rbuf,sizeof(rbuf),0);}}//负责连接else if(fds[3].revents==POLLIN){int newfd=-1;if((newfd=accept(sfd,(struct sockaddr*)&cin,&socklen))==-1){perror("connect error");return -1;}newsin[newfd]=cin;printf("[%s:%d]connect success\n",inet_ntoa(newsin[newfd].sin_addr),ntohs(newsin[newfd].sin_port));fds[newfd].fd=newfd;}for(int i=4;i<1024;i++){//服务器端输入if(fds[i].revents!=POLLIN){continue;}{		//表示其余待触发poll	bzero(rbuf,sizeof(rbuf));char lbuf[128]="";int f=recv(fds[i].fd,rbuf,sizeof(rbuf),0);if(rbuf[0]=='N'){char *p=rbuf;p=p+1;strcpy(name[i],p);sprintf(lbuf,"------------%s已上线-----------",name[i]);for(int j=4;j<1024;j++){send(fds[j].fd,lbuf,sizeof(lbuf),0);}continue;}if(strcmp(rbuf,"quit")==0){sprintf(lbuf,"[%s:%d]%s已下线",inet_ntoa(newsin[i].sin_addr),ntohs(newsin[i].sin_port),name[i]);close(fds[i].fd);newsin[i].sin_addr.s_addr=0;newsin[i].sin_port=0;fds[i].fd=-1;for(int k=4;k<1024;k++){		send(fds[k].fd,lbuf,sizeof(lbuf),0);	}send(fds[0].fd,lbuf,sizeof(lbuf),0);continue;}bzero(lbuf,sizeof(lbuf));char *p=rbuf;p=p+1;strcpy(lbuf,p);sprintf(wbuf,"[%s:%d]%s:%s",inet_ntoa(newsin[i].sin_addr),ntohs(newsin[i].sin_port),name[i],lbuf);for(int j=4;j<1024;j++){if(j==i){continue;}send(fds[j].fd,wbuf,sizeof(wbuf),0);}}}}close(sfd);return 0;
}

客户端

#include <myhead.h>
#define SERIP "192.168.125.99"
#define SERPORT 9999int main(int argc, const char *argv[])
{int cfd=-1;if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);int reuse=1;if(setsockopt(cfd,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(SERPORT);sin.sin_addr.s_addr=inet_addr(SERIP);if((connect(cfd,(struct sockaddr*)&sin,sizeof(sin)))==-1){perror("connect error");return -1;}printf("connect success\n");struct pollfd fds[2];fds[0].fd=0;fds[0].events=POLLIN;fds[1].fd=cfd;fds[1].events=POLLIN;int flag=0;char rbuf[128]="";char buf[128]="";char n[129]="N";char s[129]="S";char q[129]="quit";int res=-1;while(1){res=poll(fds,2,-1);if(res<0){perror("poll error");return -1;}else if(res==0){printf("time out\n");return -1;}if(fds[0].revents==POLLIN){if(flag==0){//输入名字bzero(buf,sizeof(buf));bzero(rbuf,sizeof(rbuf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;strcat(rbuf,n);strcat(rbuf,buf);send(cfd,rbuf,sizeof(rbuf),0);flag=1;}else{//输入信息bzero(buf,sizeof(buf));bzero(rbuf,sizeof(rbuf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;if(strcmp(q,buf)==0){send(cfd,buf,sizeof(buf),0);goto END;}strcat(rbuf,s);strcat(rbuf,buf);send(cfd,rbuf,sizeof(rbuf),0);}}if(fds[1].revents==POLLIN){bzero(rbuf,sizeof(rbuf));recv(cfd,rbuf,sizeof(rbuf),0);printf("%s\n",rbuf);}}
END:close(cfd);return 0;
}

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

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

相关文章

MyBatis的关联查询!!!(一对一、一对多、多对多)

准备工作&#xff1a; 1.创建Maven工程&#xff0c;还没有配置Maven的和还不会的去看这里啦&#xff1a;maven的下载安装与配置环境变量&#xff01;&#xff01;&#xff01;&#xff08;全网最详细&#xff09;-CSDN博客 Account.java : (pojo类) &#xff08;这里我…

torch中关于张量是否是叶子结点,张量梯度是否会被计算,张量梯度是否会被保存的感悟

先上结论&#xff1a; 1、叶子结点定义: &#xff08;1&#xff09;不依赖其它任何结点的张量 &#xff08;2&#xff09;依赖其它张量&#xff0c;但其依赖的所有张量的require_gradFalse # 判断方法&#xff1a;查看is_leaf属性 2、张量梯度是否会被计算: require_…

SpringMVC之文件的下载

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 SpringMVC之文件的下载 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、文件下载实现…

认识Linux背景

1.发展史 Linux从哪里来&#xff1f;它是怎么发展的&#xff1f;在这里简要介绍Linux的发展史 要说Linux&#xff0c;还得从UNIX说起 UNIX发展的历史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Mu…

分布式锁常见问题及其解决方案

一、为什么要使用分布式锁&#xff1f; 因为在集群下&#xff0c;相当于多个JVM&#xff0c;就相当于多个锁&#xff0c;集群之间锁是没有关联的&#xff0c;会照成锁失效从而导致线程安全问题 分布式锁可以分别通过MySQL、Redis、Zookeeper来进行实现 二、redis分布式锁的实…

华为发布全闪备份一体机旗舰新品,并宣布备份软件开源

[中国&#xff0c;上海&#xff0c;2023年12月20日]在20日举行的OceanProtect数据保护新品发布会上&#xff0c;华为发布全闪备份一体机旗舰新品&#xff0c;并宣布备份软件开源&#xff0c;以应对智慧金融、自动驾驶等场景对数据备份效率及数据安全方面的新诉求&#xff0c;为…

工业信息采集平台的五大核心优势

关键字&#xff1a;工业信息采集平台,蓝鹏数据采集系统,蓝鹏测控系统, 生产管控系统, 生产数据处理平台,MES系统数据采集, 蓝鹏数据采集平台通过实现和构成其他工业数据信息平台的一级设备进行通讯&#xff0c;从而完成平台之间的无缝对接。这里我们采用的最多的方式是和PLC进行…

神经网络:深度学习基础

1.反向传播算法&#xff08;BP&#xff09;的概念及简单推导 反向传播&#xff08;Backpropagation&#xff0c;BP&#xff09;算法是一种与最优化方法&#xff08;如梯度下降法&#xff09;结合使用的&#xff0c;用来训练人工神经网络的常见算法。BP算法对网络中所有权重计算…

力扣labuladong——一刷day77

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣207. 课程表 前言 图这种数据结构有一些比较特殊的算法&#xff0c;比如二分图判断&#xff0c;有环图无环图的判断&#xff0c;拓扑排序&#xff0c;以…

Redis取最近10条记录

有时候我们有这样的需求&#xff0c;就是取最近10条数据展示&#xff0c;这些数据不需要存数据库&#xff0c;只用于暂时最近的10条&#xff0c;就没必要在用到Mysql类似的数据库&#xff0c;只需要用redis即可&#xff0c;这样既方便也快&#xff01; 具体取最近10条的方法&a…

19-二分-值域二分-有序矩阵中第 K 小的元素

这是二分法的第19篇算法&#xff0c;力扣链接。 给你一个 n x n 矩阵 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 个 不同 的元素。 你必须找到一个内存复杂…

ElasticSearch插件手动安装

./plugin install file:///home/es2.4/es/elasticsearch-kopf-master.zipElasticSearch插件手动安装_如何下载elasticsearch-kopf-master.zip-CSDN博客

Go 代码检查工具 golangci-lint

一、介绍 golangci-lint 是一个代码检查工具的集合&#xff0c;聚集了多种 Go 代码检查工具&#xff0c;如 golint、go vet 等。 优点&#xff1a; 运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表&…

异常(Java)

1.异常的概念 在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 1.算数异常 System.out.println(10 / 0); // 执行结果 Exception in thread "main" java.lang.ArithmeticException: / by zero 2.数组越界异常 int[] arr {1, 2, 3}; System.out.…

ARM 汇编入门

ARM 汇编入门 引言 ARM 汇编语言是 ARM 架构的汇编语言&#xff0c;用于直接控制 ARM 处理器。虽然现代软件开发更多地依赖于高级语言和编译器&#xff0c;但理解 ARM 汇编仍然对于深入了解系统、优化代码和进行低级调试非常重要。本文将为您提供一个简单的 ARM 汇编入门指南…

DBA-MySql面试问题及答案-上

文章目录 1.什么是数据库?2.如何查看某个操作的语法?3.MySql的存储引擎有哪些?4.常用的2种存储引擎&#xff1f;6.可以针对表设置引擎吗&#xff1f;如何设置&#xff1f;6.选择合适的存储引擎&#xff1f;7.选择合适的数据类型8.char & varchar9.Mysql字符集10.如何选择…

第九周算法题(哈希映射,二分,Floyd算法 (含详细讲解) )

第九周算法题 第一题 题目来源&#xff1a;33. 搜索旋转排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a;整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 <…

全网最全ChatGPT指令大全prompt

全网最全的ChatGPT大全提示词&#xff0c;大家可以进行下载。 AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 数据库Mysql 8.0 54集 数据库Oracle 21C 142集 Office 2021实战应用 Python 数据分析实战&#xff0c; ETL Informatica 数据仓库案例实战 E…

【JAVA面试题】什么是引用传递?什么是值传递?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 前言 博客的正文部分可以详细介绍Java中参数传递的机制&#xff0c;强调Java是按值传递的&#xff0c;并解释了基本数据类型和对象引用在这种传…

二级分销的魅力:无限裂变创造十八亿的流水

有这么一个团队&#xff0c;仅靠这一个二级分销&#xff0c;六个月就打造了十八亿的流水。听着是不是很恐怖&#xff1f;十八亿确实是一个很大的数字&#xff0c;那么这个团队是怎么做到的呢&#xff1f;我们接着往下看。 这是一个销售减脂产品的团队。不靠网店&#xff0c;不…