TCP并发服务端的实现
创始人
2024-09-25 07:27:49
0

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

方法:

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

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

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

#include

   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

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

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

相关内容

热门资讯

秒懂教程!拼三张房卡多少钱一张... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
微信炸金花房间房卡怎么买/微信... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
微信好友炸金花房卡在哪里买/微... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...
秒懂教程!微信里面斗牛链接房卡... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
软件不支持安卓系统,揭秘软件为... 你有没有遇到过这种情况?买了一款心仪的手机,却发现心仪的软件不支持安卓系统,心里那个滋味啊,就像吃了...
怎么创建拼三张房间卡房卡/新鸿... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:55051770许多玩家在游戏中会购买房卡来享...
拼三张房卡如何充值/新蓝鲸大厅... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:8488009许多玩家在游戏中会购买房卡来享受...
安卓系统的钓鱼之王,揭秘钓鱼软... 你知道吗?在安卓系统的世界里,有一个大名鼎鼎的家伙,它就像是个钓鱼高手,专门钓那些不小心上钩的用户。...
安卓系统免费观看视频,解锁海量... 亲爱的手机控们,你是不是也和我一样,对免费观看视频的安卓系统应用情有独钟?没错,在这个信息爆炸的时代...
安卓系统换成ios系统数据怎么... 你有没有遇到过这种情况:手机从安卓系统换成iOS系统后,突然发现之前积累的数据不翼而飞,心里那个急啊...
安卓原车机系统,安卓原车机系统... 你有没有发现,现在很多车都开始变得智能起来呢?这不,安卓原车机系统就悄悄地走进了我们的生活。想象坐在...
安卓车机通用系统下载,智能驾驶... 你有没有发现,现在汽车界也开始流行智能化了?没错,就是那个我们平时挂在嘴边的安卓车机通用系统。今天,...
安卓原生系统应用商店,一站式应... 你有没有发现,每次打开你的安卓手机,那个应用商店总是那么默默地陪在你身边?它就像一个贴心的助手,帮你...
安卓系统怎么样安装wd系统,安... 你有没有想过给你的安卓手机来个“变身”大改造?没错,就是将安卓系统升级为WD系统!听起来是不是有点酷...
安卓系统升级速度,从快速迭代到... 你有没有发现,每次打开手机,安卓系统总在默默地进行升级?这就像是我们的小助手,时不时地给自己充充电,...
安卓苹果系统流畅性,系统流畅性... 你有没有发现,现在手机的世界里,安卓和苹果两大巨头就像是在赛跑,你追我赶,谁都不愿意落后。今天,咱们...
浩顺收银系统下载安卓,助力商家... 你有没有想过,在繁忙的商场里,那些收银员是如何快速而准确地完成每一笔交易的?这其中,浩顺收银系统可是...
安卓系统怎么降级吗,轻松实现系... 你有没有发现,手机用久了,系统更新换代的速度简直比兔子还快!这不,你的安卓手机可能也跟着潮流升级到了...
安卓系统外接鼠标设置吗,轻松实... 你有没有想过,给你的安卓手机或者平板电脑配上一个鼠标,让它瞬间变身成一台迷你电脑呢?这听起来是不是很...
微信拼三张房卡哪里有卖/狂飙大... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:33903369许多玩家在游戏中会购买房卡来享...