一文掌握tcp服务器epoll的多种实现

tcp使用epoll进行实现并发 tcp使用epoll进行实现并发 tcp 服务器编写的步骤都是很熟悉的了。tcp由于每一个新的连接都会新建一个socket和客户端进行通信,但是新建立的连接在很多次之后就会管理就会出现问题,这个时候就可以使用epoll进行管理。 epoll是一种多路转接io,相比selete和poll在管理大量描述符的时候优势很明显。具体的优势我们后面可以慢慢说。 epoll的流程, 创建epoll描述符–> 添加事件–> wait; int epoll_create (int __size) __size 阅读详情

tcp服务器epoll的多种实现

  • 总结

我们在读写文件的时候,这是一款服务器,CS,这是一个服务器,这个客户端去连接服务器的时候,中间大家知道从连接的这个过程中间产生通过三次握手连接,服务器先进行监听一个端口,监听的时候是用调用listen进行监听,

TCP网络编程模型就好比这样一个模型,大家去酒店吃饭,走到那个饭店的门口门口有一个迎宾的人,有迎宾的小姐姐,然后你跟她说吃饭,她把你带进餐馆里面,然后给你介绍一个真正的服务员,后面你点菜买单,然后包括像夹菜点酒都是由这个服务员为你去服务。

这里面这个酒店出现两个人,一个是对你的迎宾的人,第二个为你服务吃饭的服务员,就这个模式。

大家可以看到客户端和服务通信也是这样一个情况,客户端就是跑到酒店去吃饭,
走到服务器这地方,服务器这里有一个listen的端口,就是迎宾的人,然后介绍一个服务员,后面客户端进行通信的时候就是介绍的这个服务员进行通信。

就是这个迎宾的人怎么让他迎宾,怎么让他开始工作?
迎宾的人上哪里去找?首先记清楚他是一个人,那这个人怎么来呢?
这里面所提到的人就是 fd,我们可以通过socket创建,创建完之后,还有比如说一个酒店特别大,比如说这个酒店特别大,它有几个门那这个迎宾的小姐姐他去那个门?他只能做一件事情,他去哪个门,所以这里我们需要绑定他在哪个门,bind()一个端口,绑定完之后,他才开始工作,真正开始工作是进入listen状态。

我想问一下这迎宾的小姐姐在listen的过程中间,他跟酒店这个管理制度有没有关系,跟这个酒店的工作流程有没有关系?没用,所以刚才讲个迎宾的小姐姐,她是一个被动的,她是一个被动的工作,就是他的工作就是listen,他不影响酒店的内部的整个工作流程,首先这点一定要记住,listen一旦进入之后,他不影响其它流程,

然后当来了一个客人之后,这时候要创建一个新的,accept才是真正接待的人,listen这个过程是指定这个迎宾的小姐姐在这个门口迎宾的工作。真的来一个客人的话,accept()介绍一个新的服务员,后面的动作点菜也好,买单也好,recv和send都是跟这个服务员之间沟通,包括close买单的时候也是。

服务器它写代码的就这么写,它就是这些接口,这个listen这个过程他就是让这个小姐姐在门口迎宾,然后剩下的就是小姐姐把这个人带进去介绍一个新的服务员

这个过程,三次握手是服务员在迎宾的这个过程中间发生的,三次握手他是被动发生的,

三次握手是在这个迎宾的人在这等待的过程中间完成,三次握手之后才把他介绍了这个新的服务员,
有人吃饭你们有人问到你是在这吃饭都说是的,这个过程叫三次握手,收到客户说是的,再把他带进去介绍服务员,

客户端这边首先吃饭,客户端也是一个人,这个人也通过socket创建的,创建完对应的他去哪里吃饭,他去哪里吃饭?准备一个地址,准备一个地址然后connect。

这个过程就是客户端连接服务器,这个过程可以绑定也可以不绑定,这个绑定的就相当于这个他出去吃饭,他的的每个门主他可以从大门走也可以小门,所以这个都okay,如果只允许他从正门走,那这时候就给他绑定一下

它是去连接的,你可以绑定也可以不绑定,所以我认为在客户当中出现了两个地址,一个是绑定的,一个是不绑定的,绑定和绑定它是一个可选项,它是一个可选项

客户端调用contact函数就是决定了它去连接这个服务器,每一个服务器IP地址端口都是多少,去找哪个酒店迎宾的小姐姐,这是确定的是在connect确定的,
这地方就连接完成之后再调用的是send和recv这是网络编程的整个流程。

这是网络编程核心的,以这些东西为基础就衍生出来了很多的做法,客户端和服务器就是这个流程

udp的服务器该怎么做?
udp就好比你去一个小餐馆,那个迎宾的人跟服务员他是一个人,就是你去了一个小饭店,没有连接在这方面,这个客户端和服务器之间不涉及到任何的连接,这个应该不用去争议的时候,

我们在设计函数的时候它的功能要做到单一讲究的一个功能,就是还是单一功能单一越单一越好。可利用可复用性就越强,就是一个函数设计功能越单一,它的可复用性就会越强,一个函数它越符号它的可复用性就越低。

recvfrom函数就有点意思,它不单只接收数据,并且还把哪个客户端给谁发都带出来了,就是recvfrom函数数据是谁发的都知道。

那现在考虑一下,比如说现在有三个udp的客户端,就是三个函数,同样都是都用sendto都是发给这一个端口,都是recvfrom由他来一个接受,

就好比一个小的餐馆,现在这个餐馆只有一个迎宾的人,现在过去了多批人多活人同时走到这个门口,我就想问一下,那这个迎宾的人,他能分清楚这三户人?他不可以,

这个服务端我们只有1个,然后如果10个1000个2000个同时调用sendoto,
我就想问一下那这个服务呢它能区分区分不了,区分不了也就是换一个说法,udp的服务器如何做多个客户端并发?

那也就是我们在udp的这个基础上面recvfrom,可能很多人会想一个办法,就是buffer里面想办法,也就是说从客户端发到服务器的时候,这个数据上面想办法,
就是我定义一种本地的协议,就是说我发送的数据包我知道是购买a发的,购完b发的数据我能知道它是b发的,然后c发的我就知道那可能同学在想的,就是我能不能通过这个数据包括应用协议来解决这个问题。

就是给buffer加客户端头,但是客户端口端加客户端头是有一个巨大的前提?

我们现在讲的第一个方法就是在我们发送的数据包上面加一层协议能不能行?
好很多朋友认为可以,好,
我跟大家讲一下不可以,为什么?

其它是有很大的前提,就是需要顺序的接收,就是需要顺序接收这是可以的。
就是我们知道a发的先到先发的先到后,发的后到那这种情情况下面它是ok的,那你可以在协议里面加一协议,这是可以的,在公网的情况下,面udp是很难保证先发的先到后发的后报可能有可能先发的数据后到后发的,数据先到。

第二种方法
其实原理也很简单,请他注意那我们用udp来做,其他注意我们也可以仿造了刚刚TCP这个迎宾的这个模式迎宾的这个人的模式,那么也我们也可以仿照这个模式,
好这样一个模式做,那怎么做呢你怎么做对吧?

我们也是这样的,创建一个迎宾的人在这里等着,
也就客户他先sendto给服务器这个迎宾的人创建一个,然后迎宾的接收到一个数据包之后,再为他准备一个服务员跟TCP一样,与其实那个就是一模一样,也准备一个服务员,也就是在那个为了真的区分好每一个客户每一个群体每个群体每个客户是谁,那个火车站前面那个小饭馆也采用了酒店这种模式,一个迎宾者和一个点赞的人,一个迎宾者一个点赞的,在各方面就采用这种模式,做一连接之后,sendto先给个迎宾的人,

TCP高并发服务器简介(select、poll、epoll实现与区别) 没有就绪的文件描述符去除read_fdsread_fds_t。 阅读详情

相关推荐

Linux下C++ EPOLL TCP服务器的设计与实现

使用EPOLL实现WebSocket服务器

robin51201的专栏 1309

这么多种TCP服务器,总有一款适合你

多进程并发服务器是指服务器能够同时处理多个客户端请求,而且每个客户端请求都在一个独立的进程中处理。,所以需要一种更为高效的服务器模型,IO复用服务器模型由此诞生,IO复用服务器分为select,poll,epoll服务器模型。本文以TCP服务器为例,详细讲述TCP各种服务器模型的优缺点,以及TCP服务器模型的演变过程,揭开各种服务器模型的神秘面纱。缺点:当并发量较高时,循环服务器的性能会受到很大的影响,因为每个请求都需要等待前一个请求处理完成后才能处理。可以同时处理多个客户端请求,提高服务器的响应速度。

weixin_39757802的博客 931

用c语言实现的epoll服务器

在linux后台开发实战操作中,epoll服务器,是必备技能。 我今天就写了一个最简单的TCP server,你稍微改改就可以用于简单的数据通信。 如果要实现别的功能,比如ET,非阻塞,数据缓存,那都要围绕读写函数改了。 主要的系统API: int epoll_create(int size); int epoll_wait(int epfd, struct epoll_event *...

yl175510的博客 1132

游戏优化:如何兼顾新内容与老设备性能?

游戏优化面临版本更新与设备兼容的双重挑战。针对新内容与旧设备适配问题,建议采用多档画质、资源LOD分级和功能开关等技术手段,确保不同配置设备都能流畅运行。同时,通过A/B测试、灰度发布和性能监控机制,降低新版本上线风险,实现功能回退与数据追踪。具体实现包括设备性能检测、远程配置管理和自动化测试工具,最终达成用户体验与版本演进的平衡。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 537

【C语言】epoll_wait / select

值得注意的是,`EPOLLERR` 通常与其他 I/O 事件(`EPOLLIN`、`EPOLLOUT` 等)一起返回,表示即使有错误,文件描述符也可能处于可读或可写状态。此外,对于某些类型的文件描述符(如 epoll 自己的文件描述符),`EPOLLERR` 也可能意味着某些系统层面的问题,你需要具备相应的处理逻辑。总体来说,`epoll_create1` 提供了更多的控制和扩展性,并且是推荐使用的方式,如果你的环境中存在支持它的 Linux 内核版本。数以万计的文件描述符。

数字人生 2214

深入EPOLL与多线程的TCP服务器实现

Linux内核事件通知机制允许进程在某些事件发生时得到通知,这类事件主要包括I/O事件、信号事件、定时器到期等。与传统轮询方式不同,事件通知机制实现了被动响应,减少了CPU的无效工作,提升了系统性能。这种机制的核心是实现了一种基于事件的驱动模式,进程只需要在事件发生前进行注册,之后便可以进入休眠状态,直到事件发生才会被唤醒。边缘触发(Edge Triggered, ET)是一种I/O事件通知机制,它只在文件描述符的I/O状态发生变化时才会通知应用程序。

weixin_42593130的博客 1103

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5777

高通Camera IFE时钟配置

高通Camera IFE时钟配置中的minHorizontalBlanking和minVerticalBlanking配置计算方法

一个懒癌的驱动工程师的随笔分享 6170

STM32 RC522串口驱动程序 (简单直接)

rc522作为使用非常多的读写卡芯片,使用SPI芯片读写应用已经非常广了。但有些时候我们只有串口可以使用,或者我们觉得串口使用更加方便,那么就必须要编写串口的驱动程序。不过很难找到可以直接使用的串口程序。所以在此将我这边写好的串口驱动写好如下: 直接上代码 下面是RC522.C的驱动文件。支持读写卡号8位数据。rc522用的是stm32 的串口3,调试显示是串口1; #include "rc522.h" #include "delay.h" /////////////////////////////////

qq_42074368的博客 9002

10行代码搞定QMT实盘交易:手把手教你用Python自动化买卖股票(附完整源代码)

本文提供了一份详尽的QMT实盘交易教程,手把手教你使用Python构建自动化交易系统。内容涵盖环境配置、账户连接、查询与下单等核心代码,并附有完整的源代码示例,帮助开发者快速掌握从零到实盘的完整流程,实现安全可靠的股票自动化买卖。

weixin_29214335的博客 443

避开这些坑!SOEM控制伺服电机时PDO配置与状态机处理的常见误区

本文深入探讨了使用SOEM控制伺服电机时PDO配置与状态机处理的常见误区,提供了详细的避坑指南。从SyncManager配置顺序到状态字位掩码应用,再到网络同步优化,帮助开发者避免通信失败和系统不稳定问题,提升工业自动化项目的可靠性。

chongtai6075的博客 484

Cursor自动生成测试用例

或者把你已有的规则直接复制粘贴到这个文档内(这里我用的是Markdown格式和CSV格式的测试用例生成规则,可以同时生成Markdown和CSV格式的测试用例)。在AI对话框这里,我们可以看到Cursor会逐步来帮我们生成测试用例,先分析识别需求文档,然后生成测试用例,最后会进行质量检查,确保生成的用例符合规范。生成的Markdown格式,可直接导入Xmind,生成思维导图,对应到具体的功能模块看具体的测试点,逻辑会更直观一些。(1)选中规则文档和需求文档:@你的测试用例规则文档@你的需求文档。

十二测试录 2433

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1425

SAP 批量修改 工艺路线 和 BOM

1、在运维的过程中经常会遇到用户需要批量更改组件,或者是批量更改数量,还是组件里面的一些标识,当处理这些批量数据处理的业务时,BOM的批量更改一个想到的就是CS20,但是CS20当BOM需要替换的时候就不是很适用。当前工作区域:选择 SAP_ITEM 对BOM行项目进行变更,工艺路线也是可以批量更改的,根据实际的业务进行选择,我这里选择的就是BOM的组件变更。5、本博客将使用新的一种方式进行BOM的批量变更,标准的事务代码:CEWB对BOM进行批量更改。3、使用LSMW的方式进行BOM的批量更改。

我小时候很黑的博客 4100

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Linux环境,C/C++语言手写代码实现线程池
下一篇: 网络IO管理-简单一问一答、多线程方式
Linux服务器开发
博客等级 码龄7年 610粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值