【C++简单项目】基于socket实现的聊天室Chat_Room

一、需求分析

聊天室中如果有人说话,服务器将内容传送给聊天室的其他人。
那么就需要客户端和服务端两个程序,一个人发送一个消息,服务器向所有人发送一遍消息,所有人的客户端接收消息,也就是说客户端负责发送和接受消息服务端负责接收和转发消息

1.客户端Client:
可以主动连接服务端;
可以与服务器之间完成接收和发送消息;

2.服务端Server:
可以接受来自客户端的连接请求;
将客户端发来的信息发送给对应的客户(广播或者私聊);

二、实现逻辑

1、服务端Server

创建服务器套接字:socket
绑定本机IP和端口:bind
监听客户端:listen
等待客户端连接:accept
发送消息:send
接收消息:recv

1)创建套接字socket

sockfd = socket(PF_INET,SOCK_STREAM,0);

2)使用bind() 将套接字与本IP和某一端口绑定

//绑定端口号和IP
serverAddr.sin_family = PF_INET;
serverAddr.sin_port = htons(SERVER_PORT);    
serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);bind(sockfd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));

3)监听套接字listen()

int ret = listen(sockfd,5);

4)接受客户端的连接请求 accept(),返回一个对此连接的新套接字

int clientfd = accept( sockfd,(struct sockaddr*)&client_address,&client_addrLenth);

sockfd:套接字描述符,
client_address:提出连接请求的客户端的主机地址
client_addrLenth:客户端的地址长度

5)用新的套接字与客户端通信,发送send() 和接受recv() 客户端数据

int send(int sockfd, const void * data, int data_len, unsigned int flags)

sockfd:套接字描述符
data:指向要发送数据的指针
data_len:数据长度,flags:通常为0

6)关闭套接字close()

2、客户端Client

客户端的端口号是系统自动分配的,所以客户端并不需要 bind 绑定地址,而且也不需要设置监听的套接字,因此也不需要 listen。

客户端在用 socket 创建套接字后直接调用 connect 向服务器发起连接即可,connect 函数通知 Linux 内核完成 TCP 三次握手连接,最后把连接的结果作为返回值。成功建立连接后我们就可以调用 sendrecv 来发送数据、接收数据,最后调用 close 来断开连接释放资源。

创建客户端套接字:socket
向服务器发起连接:connect
发送消息:send
接收消息:recv

在这里插入图片描述

三、提升服务器的处理能力?

服务器需要维护与多个客户端的连接。对于一个服务器,要是聊天的人一多就会出现严重延迟是绝对不可以的,也就是一个个轮询的方式是费时费力的,那么我们会想办法解决这个问题。

1、为什么用epoll?

相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select/poll的实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。

epoll的底层维护是一颗红黑树,查找和删除修改等等操作都是log级别的,所有很快,具体来说就是一颗红黑树,里面有很多fd,此时来了一个事件,我在树上快速查找有没有与之对应的fd,有就将其添加至list里。然后由下面讲的epoll_wait去等,等待list不为空、收到信号、超时这三种条件后返回一个值。

2、epoll的接口

epoll的实现非常简单,一共就三个接口函数:

  1. int epfd = epoll_create(int size);
    首先通过create_epoll(int size)来创建一个epoll的句柄,其中size为要监听的数目。这个函数会返回一个新的epoll句柄 epfd ,之后的所有操作将通过 epfd 来进行操作。在用完之后,记得用close()来关闭这个创建出来的epoll句柄。

  2. int epoll_ctl (int epfd, int op, int fd, struct epoll_event *event);
    epoll的事件注册函数,它不同于是select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
    其中,第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:
    EPOLL_CTL_ADD:注册新的fd到epfd中;
    EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
    EPOLL_CTL_DEL:从epfd中删除一个fd;
    第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,

  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
    等待事件的产生,通过调用收集在句柄为epfd的epoll中监控到的已发生的事件,把这些事件放入事件队列events里面去。

3、关于LT和ET两种工作模式:

对于水平触发(LT) 模式,一个事件只要有,就会一直触发。
对于边缘触发(ET) 模式,在一个事件从无到有时才会触发。
水平触发是每次epoll_wait() 会将所有可读写的fd返回,系统开销比较大,而边沿触发则是只会返回一次,如果这次我们没有及时处理,那么下一次调用epoll_wait() 则不会有这个fd,除非这个fd再次被触发事件。

对于socket的读事件
水平模式——只要在socket上有未读完的数据,就会一直产生EPOLLIN事件;
于边缘模式——socket上每新来一次数据就会触发一次,如果上一次触发后未将socket上的数据读完,也不会再触发,除非再新来一次数据。

对于socket写事件
水平模式——如果socket的TCP窗口一直不饱和,就会一直触发EPOLLOUT事件;
边缘模式——只会触发一次,除非TCP窗口由不饱和变成饱和再一次变成不饱和,才会再次触发EPOLLOUT事件。

结论:
ET模式仅当状态发生变化的时候才获得通知,这里说的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样;
而LT模式是只要有数据没有处理就会一直通知下去的.

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

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

相关文章

基于TCP的网络聊天室实现(C语言)

基于TCP的网络聊天室实现(C语言) 一、网络聊天室的功能二、网络聊天室的结果展示三、实现思路及流程四、代码及说明1.LinkList.h2.LinkList.c3.client.c4.server.c 一、网络聊天室的功能 有新用户登录,其他在线的用户可以收到登录信息 有用户…

CobaltStrike(钓鱼攻击工具)

一、介绍 1、CobaltStrike是一款渗透测试软件,分为客户端与服务端,可以进行团队分布式操作,服务端:1个,客户端:N个,被业界人称为CS神器。 2、CobaltStrike集成了端口转发、服务扫描,自动化溢出,…

Discord 私信钓鱼手法分析

事件背景 5 月 16 日凌晨,当我在寻找家人的时候,从项目官网的邀请链接加入了官方的 Discord 服务器。在我加入服务器后立刻就有一个"机器人"(Captcha.bot)发来私信要我进行人机验证。这一切看起来相当的合理。我也点击了这个验证链接进行查看。…

154.网络安全渗透测试—[Cobalt Strike系列]—[钓鱼攻击/鱼叉钓鱼]

我认为,无论是学习安全还是从事安全的人多多少少都有些许的情怀和使命感!!! 文章目录 一、钓鱼攻击和鱼叉钓鱼简介1、钓鱼攻击简介2、钓鱼攻击模块:6个3、鱼叉钓鱼简介4、鱼叉钓鱼示例:邮件钓鱼 二、钓鱼攻…

个人年终述职报告PPT怎么做?

适用于职场工作汇报、述职报告、岗位竞聘的PPT模板 这套微粒体风格的述职报告PPT模板采用了立体的几何图形设计,以白色、橙色、深蓝色为主,整体设计简约大气高端。其中还结合了时间轴、流程图、脑图等PPT素材,可以更直观展现工作述职报告的内…

计算机机房防雷接地标准,机房防雷接地规范与防雷接地方式,你知道吗?

雷电的描述 雷电是由天空中云层间的相互高速运动、剧烈磨擦,使高端云层和低端云层带上相反电荷。此时,低端云层在其下面的大地上也感应出大量的异种电荷,形成一个极大的电容,当其场强达到一定强度时,就会产生对地放电&…

地凯模块化机房防雷接地防雷工程设计方案

智能微模块的防雷接地系统由防雷方案和接地方案组成。 防雷方案:智能微模块主要有以下防雷工程方案。 SPD(surge protection device)浪涌保护器的安装符合以下要求:SPD 安装在被保护设备 的前端,SPD 的连接导线应尽可…

防雷工程中防雷等级的意义

在现代社会中,各种电子设备和通信系统已经成为我们生活中不可或缺的一部分。然而,雷击是这些设备和系统的一个常见问题,不仅会导致设备损坏,还可能对人们的生命财产造成威胁。因此,防雷措施变得尤为重要。 为了保护设…

防雷接地的施工工艺与防雷施工方案

雷电是自然界的一种强大而危险的自然现象,经常造成重大财产损失和人员伤亡。为了保护建筑物和人员免受雷电的危害,防雷接地系统的设计和施工至关重要。本文将介绍防雷接地的施工工艺和防雷施工方案,强调专业和符合国家标准的方法,…

防雷知识:什么是雷电浪涌

浪涌是突然发生并超过典型工作电压的过电压。一般来说,浪涌是电路中短暂的电流、电压或功率波。今天我们就来科普一下什么是雷电浪涌。 什么是浪涌? 浪涌,顾名思义,是一种突然发生并超过典型工作电压的过电压。一般来说&#xf…

单位、家庭建筑物电气、电子设备防雷举措

前 言 在现实的学习、工作、生活中,有时会面对自然灾害、重特大事故、环境公害及人为破坏等突发事件,为了控制事故的发展,就不得不需要事先制定应急预案。那要怎么制定科学的应急预案呢﹖下面是小编为大家整理的单位、住宅建筑物、电子电气防…

科学防雷接地和雷电防护方案

说到防雷,可能不少人首先会想到避雷针,而“避雷针”这一概念,很容易让大家对防雷的概念造成误解。 误解1: 避雷针是用来“避雷”的。 其实,避雷针的学名叫“接闪器”,不是用来“避开雷击”的,而是用来“迎…

通信基站防雷接地方案

由于各基站的环境和建设方式不同,所以对基站防雷接地不能一概而论,应根据具体情况采取防雷与接地措施, 因地制宜实施防雷接地工程,将基站接地系统按照均压等电位的原理进行设计和改造,即通信设备的工作地、保护地、防雷…

智能云防雷,信号浪涌保护器防雷接地方案

1 现代防雷的重点是信息化设备 信息技术设备是集计算机技术和微电子技术于一身的高科技技术产品,由大规模芯片电路组成,信号电压低,抗雷击电磁脉冲(LEMP)的能力很差,在闪电强磁场环境下的易损性较高。雷电已成为信息技术应用中的一…

做好防雷检测的重要意义和作用

防雷检测是一项非常重要的工作,它可以保障人们的生命财产安全,并维护国家的安全稳定。地凯科技将从防雷的重要性、防雷检测的行业应用和防雷行业国标三个方面来阐述防雷检测的重要性。 一、防雷的重要性 随着科技的不断发展,人们的生活和工作…

同为(TOWE)远程智能防雷预警监测——交直流遥信防雷配电柜

当前,社会各领域中各类先进的电子仪器广泛分布于每一个角落,由于高精尖电子设备的高度集成化,其耐压水平普遍较低,导致雷电流、浪涌侵入设备的风险越来越高,故需要在重要设备前端加装浪涌保护器(SPD&#x…

教你学会塔罗免费占卜十八招

教你学会塔罗免费占卜十八招 塔罗牌占卜抽到不好的命运怎么办?#塔罗牌#塔罗牌占卜 hello,大家好,这是我的第一期文章。今天主要讲一讲在塔罗牌占卜中,有的时候我们会抽到不好的命运,不好的牌艺,我们该如何…

全新算命付费测算网站源码 星座运势塔罗牌牛年运程宝宝起名姻缘等

介绍: PHP开发的 网盘下载地址: http://kekewangLuo.net/BFhpbGNNy1P 图片:

最新修复PHP塔罗牌风水占卜源码 对接支付

介绍: 测试环境:Nginx 1.18.0-MySQL 5.6.49-PHP-5.6 大家跟着这个环境配置就行 1.创建站点,上传源码至根目录,解压 2.创建数据库,填入数据库配置信息,上传,导入 数据库 3.修改数据库连接信息 …

2023最新测算系统源码/有风水起名/算姻缘/易经周易/占卜开运等等

正文: 支持微信/支付宝H5和电脑端扫码支付、手机端可以调起微信/支付宝应用支付 支持后台设置价格、后台设置支付接口信息 支持各种手机浏览器、微信公众绑定、微信内,等各种设置的使用和调起支付能力 支持分销代理功能,可设下线、用户自主注册、也可…