TCP并发服务端的实现

news2024/12/23 8:48:58

思想:创建多个套接字,由"我"来管理这些套接字

方法:

1.多进程
2.多线程
3.IO多路复用

tcp服务器端创建流程:

socket()

bind()

listen()

connfd = accept

IO多路复用:

多个文件I复用同一个进程

IO模型

IO模型

1.阻塞IO

fgets scanf read recv gerchar

2.非阻塞IO

1.使用轮询的方式实现,可以监测多路IO

2.cpu占有率较高

实现:

1.获取原文件描述符的属性

fcntl();

F_GETFL;

2.增加非阻新属性

3.设置新属性

3.信号驱动IO

1.异步通知的io方式,节省cpu

4.IO多路复用

1.多个IO复用一个进程(谁的文件描述符到达了,就进行那个文件描述符关联的文件的读写操作)

2.不适合处理比较耗时的任务

内核提供的IO多路复用接口:

select
poll
epoll

处理流程:

1.创建一个需要关注的文件描述符的集合

2.添加文件描述符到集合中

3.通知内核开始监测

4.根据监测返回的结果做对应的操作(对IO的读/写操作)

管道文件、系统文件、文件描述符等

select    :

Int  select(int   nfds,    fd_ set * readfds,    fd_set   * wirtefds,    fd_set   *exceptfds,struct  timeval  * timeout)

功能:监测多路IO

参数:

readfds:关注的读事件的文件描述符集合

writefds:关注的写事件的文件描述符集合

exceptfds:其他 异常

timeout:超时时间 如果不设置就写NULL

返回值:

成功:返回到达事件的个数

失败:-1

设置了超时时间:超时时间到达,但没有事件,返回0

在Linux下,文件描述符的分配遵循最小未被分配原则。

比如你已经分配了fd,则下一个文件描述符一定比fd大

Linux中就只有1024个文件描述符

1.select缺点:

1.select监听文件描述符最大个数为1024(数组)0 (n)不

2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据

3.select需要循环遍历一次才能找到产生的事件

4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)

poll缺点:

1.po11监测文件描述符不受上限限制(链表)0(n

2.po11监听的文件描述符集合在用户层,需要内核层向用户层传递数据

3.po11需要循环遍历一次才能找到产生的事件

4.po11只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)

epoll

将检测的文件描述符由链表改为红黑树(查找效率更高)

时间复杂度:用来衡量某个程序的效率

红黑树---->二叉树 时间复杂度(logn)

优点:

1.epol1创建内核事件表,不受到文件描述符上限限制(红黑树) 0(logn

2.epoll监听的事件表在内核中,直接在内核中监测事件效率高

3.epo11会直接获得产生事件的文件描述符的信息,而不需要遍历检测

4.epol1既能工作在水平触发模式,也能工作在边沿触发模式

epoll使用步骤:

1.创建文件描述符集合

因为是内核创建,所以要调用一个函数接口,通知内核创建集合

int epoll_create

#include <sys/epoll.h>

   int epoll_create(int size);
 参数:
    告诉内核大概放多少个文件描述符
 返回值:
    成功:返回一个文件描述符(集合句柄)
    失败:-1

2.添加文件描述符到集合中 epoll_ctl

#include <sys/epoll.h>

   int epoll_ctl(int epfd, int  op,  int  fd,  struct
   epoll_event *event);

参数:
  epfd:文件描述符集合句柄
  op:操作
  ​    EPOLL_CTL_ADD:向集合中添加文件描述符
  ​    EPOLL_CTL_MOD:修改集合
  ​    EPOLL_CTL_DEL:删除 
  fd:操作的文件描述符
  event:文件描述符所对应的事件
  
  typedef union epoll_data {
               void        *ptr;
               int          fd;
               uint32_t     u32;
               uint64_t     u64;
           } epoll_data_t;

  struct epoll_event {
       uint32_t     events;   /* Epoll events */
       epoll_data_t data;     /* User data variable */
                      };
  events member:

3.通知内核开始监测: epoll_wait

#include <sys/epoll.h>

   int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
   
 参数:
    epfd:文件描述符集合句柄
    events:保存到达事件的集合的首地址
    maxevents:监测的事件的个数
    timeout:超时时间
             -1:不设置超时时间
 返回值:
    成功:返回到达事件的个数
    失败:-1
    设置超时:超时时间到达则返回0

4.根据epoll_wait返回的结果,做对应的操作(对IO 读、写)

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

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

相关文章

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

【香橙派系列教程】(十八) 视觉垃圾桶-网络线程

【十八】视觉垃圾桶-网络线程 文章目录 【十八】视觉垃圾桶-网络线程一、增加网络控制功能1.实现需求&#xff1a;2.TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。三、C语言实现TCP KeepAlive功能1.函数原型2.返回…

Python+tkinter实现俄罗斯方块游戏

游戏界面&#xff1a; 一个方块区域&#xff08;游戏板&#xff09;&#xff0c;显示当前分数和最高分的标签&#xff0c;以及控制按钮&#xff08;重启、暂停、显示排行榜&#xff09;。玩家可以通过点击“Restart”按钮重启游戏&#xff0c;点击“Pause”按钮暂停游戏&#…

Windows隐藏起你的秘密文件以及文件夹工具

我们都知道&#xff0c;在 Windows 中可以右键文件夹&#xff0c;选择”属性“&#xff0c;勾选”隐藏“来实现隐藏某个文件夹。 我们还知道&#xff0c;在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“&#xff0c;来使上述方法变得形同虚设。 本工具就是用于解决以上…

Spring框架:开发者的得力伙伴,魅力何在?

目录 一. Spring介绍 二. Spring搭建 三. Spring Bean管理 ▐ 管理方式 ▐ 依赖注入 四. Spring数据访问层管理 五. Spring集成MyBatis 海漫浩浩,我亦苦作舟!大家一起学习,一起进步! 一. Spring介绍 Spring是什么? Spring 是一个轻量级的, IOC 和 AOP 的一站式 J…

刷机维修进阶教程-----小米系列机型手机端 直接修改参数步骤解析

在前面分享的修改机型参数的博文中都是开启端口。然后使用电脑端工具类 进行修改参数。今天来给大家解析下小米系列机型如何直接在手机端上面进行修改。在这里要切记。操作前需要备份原机的各项基带参数 分区以及基带qcn。避免操作失误无信号无基带故障出现。 通过博文可以初…

产业园的运营到底有多重要?

在当今经济高速发展的时代&#xff0c;产业园如雨后春笋般涌现&#xff0c;成为推动产业升级和区域经济发展的重要力量&#xff0c;然而&#xff0c;一个成功的产业园并非仅仅依靠开发建设就能实现其价值&#xff0c;更需要精心的运营管理。为什么这么说&#xff1f;今天我们就…

RSA加密解密算法认识及signln_resolve

RSA初步了解 一、首先认识rsa是一种非对称加密算法。 对称加密&#xff1a;加密解密使用同一个密钥&#xff0c;加密者接受信息采用密钥加密&#xff0c;而到破译者手中还是使用这份密钥。这种方式的优点是加密效率高、加解密速度快&#xff0c;但是缺点是密钥需要共享&#x…

如何评价快手可灵的图生视频能力,和市场同类产品相比孰优孰劣?

利用AI工具批量生成影视短剧推广https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为可灵AI官方认证为数不多的几十名超级创作者之一&#xff0c;同时也是AI视频生成多种应用的深度使用者&#xff0c;我来回答下这个问题。 我认为快手可灵是目前市场上无可争议&#xff0c;顶级的图…

python方法介绍

python基础语法 前言导读:Python的创始⼈人为吉多范罗苏姆(Guido van Rossum)。 1989年年的圣诞节期间,吉多范罗苏姆为了了在阿姆斯特丹打发时间,决⼼开发一个新的脚本解释程序,作为ABC语言的一种继承。其诞生于1990年; 1. 基础常识 1.1 python的发展 1989年,Guido (…

Python青少年简明教程:流程控制语句

Python青少年简明教程&#xff1a;流程控制语句 流程控制是编程语言中用于控制程序执行顺序的机制。它决定了代码块的执行路径&#xff0c;包括哪些语句会被执行、哪些不会被执行以及在什么条件下执行。 本节介绍Python的流程控制语句。 if语句 if语句简单的语法格式如下&…

通过观测云 eBPF Tracing 实现无埋点的全链路追踪

前言 随着微服务架构的普及和系统复杂度的增加&#xff0c;对应用程序的可观测性要求也越来越高。传统的监控方法通常需要在应用程序中添加代码来记录和追踪重要信息&#xff0c;这种方法可能会增加系统的负担&#xff0c;并且在复杂系统中维护难度较大。 eBPF&#xff08;Ex…

翻译_Clock Domain Crossing Design

翻译_Clock Domain Crossing Design 原文标题及连接:Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog. 作者:Clifford E. Cummings Sunburst Design, Inc. cliffc@sunburst-design.com 摘要 在多时钟设计中,需要在时钟域交叉(…

SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

(经验)SVN降版本,保留版本信息和用户信息。

背景&#xff1a;由于开始公司人数规模小&#xff0c;没有关心SVN最新版本免费对于用户数量限制要求不敏感&#xff0c;随着人数越来越多&#xff0c;公司来了新员工已经添加不了SVN需要注册码了&#xff0c;不利于SVN文件管理的在公司内部的推广。看了好多资料&#xff0c;都没…

Java:jdk8之后新增的时间API

文章目录 为什么要使用新增的API新增了哪些&#xff1f;Local常用方法代码一样的用法 黑马学习笔记 使用新增的 为什么要使用新增的API 新增了哪些&#xff1f; Local 常用方法 代码 package NewTime;import java.time.LocalDate;/*** Author: ggdpzhk* CreateTime: 2024-08-…

【Python入门思维概括图】

&#x1f4d6;入门思维概括图 ✅第1节 基础语法 ✅第2节 判断语句 ✅第3节 循环语句 ✅第4节 函数 ✅第5节 数据容器 ✅第6节 函数进阶 ✅第7节 文件操作 ✅第8节 异常模块和包 拓展&#xff1a;学了python能干什么&#xff0c;可以参考下面的Python使用场景思维导图介绍

慈云寺北里社区新时代文明实践站联手鼓动青春丰富青少年暑期生活

炎炎夏日的暑期&#xff0c;慈云寺北里社区新时代文明实践站携手鼓动青春&#xff0c;为社区青少年精心策划并成功举办了两场丰富多彩的暑期活动&#xff0c;不仅为孩子们的假期生活增添了浓厚的文化色彩&#xff0c;更激发了他们对中华传统文化与现代艺术的浓厚兴趣。 首场&am…

《JavaEE进阶》----4.<SpringMVC①简介、基本操作>

本篇博客讲解 MVC思想、及Spring MVC&#xff08;是对MVC思想的一种实现&#xff09;。 Spring MVC的基本操作、学习了六个注解 RestController注解 RequestMappering注解 RequestParam注解 RequestBody注解 PathVariable注解 RequestPart注解 MVC View(视图) 指在应⽤程序中…

IO复用技术

一、I/O复用的介绍 I/O复用是一种能够同时处理多个I/O操作的技术&#xff0c;适用于高并发场景。 使用场景 select/poll&#xff1a;适用于连接数较少的场景。epoll&#xff1a;适用于大规模的网络服务&#xff0c;如Web服务器。 二、实现方式 1.select select 是一种系统调…