当前位置: 首页 > news >正文

网络编程学习总结3

多路复用

    使用一个进程(且只有主线程)同时监控若干个文件描述符的读写情况这种读写模式称为多路复用

    多用于TCP的服务端,用于监控客户端的链接和数据的发送

    优点:不需要频繁的创建,销毁进程从而节约了内存资源,时间资源,也避免了进程之间的竞争,等待

    缺点:要求单个客户端的任务不能太过于耗时,否则其他客户端就会感知到卡顿

    适合并发量高但是任务量短小的情景,例如:Web服务器

select:

    fd_set 是文件描述符的集合,使用一下函数操作:

    void FD_CLR(int fd, fd_set *set);

    功能:从集合set中删除fd文件描述符

   

    int  FD_ISSET(int fd, fd_set *set);

    功能:判断集合set中是否存在fd文件描述符

    void FD_SET(int fd, fd_set *set);

    功能:向集合set中添加fd文件描述符

    void FD_ZERO(fd_set *set);

    功能:清空集合set

    int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

    功能:同时监控多个文件描述的读,写异常操作

    nfds:被监控的文件描述符中的最大值+1

    readfds:监控读操作的文件描述符集合

    writefds:监控写操作的文件描述符集合

    exceptfds:监控异常操作的文件描述符集合

    timeval:设置超时时间

        NULL    一直阻塞,直到某个文件描述符发生了变化

        0秒0微秒 非阻塞

        大于0秒 等待超时时间,超时返回0

        struct timeval {

               long    tv_sec;         //   秒

               long    tv_usec;        //   微秒

           };

    返回值:监控到发生相关操作的文件描述符的个数,超时返回0,错误返回-1;

    注意:

        readfds,writefds,exceptfds 这三个集合参数既是输入也是输出,,调用select时这三个集合

        需要存储被监控的文件描述符,当由于有文件描述符发生了相应的操作而导致函数返回时,

        这三个集合中存储了这些文件描述符并返回给调用者

    select设计不合理的地方:

        1,每次调用select都需要向它重新传递被监控的文件描述符集合

        2,调用结束后如果想知道具体是哪个文件描述符发生了相关的操作,必须对所有被监控的文件描述符

        进行一遍测试

    select的优点:

        他是最早的多路复用函数,几乎所有的操作系统都支持,兼容性很高

pselect:

    int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

    const struct timespec *timeout, const sigset_t *sigmask);

    功能:大致与select

    区别:

        1,超时时间的结构类型不同

        struct timespec {

               long    tv_sec;         //秒

               long    tv_nsec;        //纳秒

        };

        2,pselect监控时可以通过sigmask参数设置要屏蔽的信号,

        可以保障pselect监控时不受这些信号干扰

    共同点:本质上与select差别不大,select的缺点pelect也是一样的,只是个别功能有所增强而已

poll:

    int poll(struct pollfd *fds, nfds_t nfds, int timeout);

    功能:

    fds:struct pollfd结构变量数组

    struct pollfd {

            int   fd;         //    被监控的文件描述符                      

            short events;     //    想要监控的事件

            short revents;    //    实际监控到的事件

                POLLIN 普通优先级的读事件  

                POLLPRI 高优先级的读事件

                POLLOUT 普通优先级的写事件

                POLLRDHUP 对方socket关闭

                POLLERR 错误事件

                POLLHUP 对方挂起

                POLLNVAL 非法描述符

        };

    nfds:数组的长度        

    timeout:超时时间 按毫秒赋值

    返回值:监控到发生相关操作的文件描述符的个数,超时返回0,错误返回-1

epoll:

    int epoll_create(int size);

    功能:创建一个epoll的内核对象,该对象可以管理,保存被监控的描述符

    size:epoll对象管理描述符的数量

    返回值:epoll对象的描述符

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

    功能:控制epoll对象,添加,删除描述符

    epfd:epoll对象的描述符

    op:

        EPOLL_CTL_ADD   添加监控描述符

        EPOLL_CTL_MOD   修改要监控的描述符的事件

        EPOLL_CTL_DEL   删除监控描述符

   

    fd: 要操作的描述符

   

    event:要监听的事件

        struct epoll_event {

               uint32_t     events;      // 要监控事件,参考poll

               epoll_data_t data;        //

            };

            typedef union epoll_data {

               void        *ptr;

               int          fd;     //  产生事件的描述符

               uint32_t     u32;

               uint64_t     u64;

           } epoll_data_t;

    返回值:成功0 失败-1

    int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

    功能:监控文件描述符,并返回发生事件的描述符

    epfd:epoll对象的描述符

    event:输出型参数,用于获取发生事件的描述符

    maxevents:可以返回事件数目的最大值

    timeout:超时时间

    返回值:监控到发生相关操作的文件描述符的个数,超时返回0,错误返回-1

    epoll优点:

        1,只需要拷贝一次待监控的文件描述符

        2,会只把发生事件的描述符返回,不需要遍历所有的描述符,大大的节约时间

        3,编程结构更加简约

epoll的条件触发和边缘触发:

    条件触发:当文件缓冲区中有需要读取的数据时就会触发事件

    边缘触发:当数据发送时触发一次事件,类似于鼠标

        1,把监控事件增加设置为EPOLLET

        优点:大大的降低事件触发的次数,在某些只需要处理一次事件即可的情景下能够提高效率

相关文章:

  • 欧姆龙CP1H如何进行PLC远程编程及数据采集
  • CSGO Bway电竞ETERNAL FIRE可以参加BLAST FALL,但MOUZ却错过了
  • 收获tips
  • Vue3+elementplus搭建通用管理系统实例十二:使用通用表格、表单实现对应功能
  • 抖音根据关键词取视频列表 API 返回值说明
  • 120页7万字XX云数据中心解决方案技术方案
  • 保险行业如何实现私域快速增长
  • 计算机网络的基础知识
  • 开发者测评:相比 Harbor,我选择 ACR 的三点原因
  • 通用配置
  • 基于JAVA自由教学平台计算机毕业设计源码+系统+数据库+lw文档+部署
  • Springboot2——配置文件、Junit、日志(笔记)
  • springboot影视评论小程序毕业设计毕设作品开题报告开题答辩PPT
  • PostgreSQL pgsql身份证格式校验,身份证格式提取api
  • redis常用命令 java中代码实现
  • “大数据应用场景”之隔壁老王(连载四)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2017-09-12 前端日报
  • C语言笔记(第一章:C语言编程)
  • docker容器内的网络抓包
  • PHP面试之三:MySQL数据库
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Zsh 开发指南(第十四篇 文件读写)
  • 从重复到重用
  • 给第三方使用接口的 URL 签名实现
  • 前端
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​插件化DPI在商用WIFI中的价值
  • #每天一道面试题# 什么是MySQL的回表查询
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • (转)【Hibernate总结系列】使用举例
  • .gitignore文件---让git自动忽略指定文件
  • .Net CF下精确的计时器
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Standard 的管理策略
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET构架之我见
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ C++ ] STL---string类的使用指南
  • [2016.7.Test1] T1 三进制异或
  • [android] 天气app布局练习
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [docker]docker网络-直接路由模式
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [Google Guava] 1.1-使用和避免null
  • [Google Guava] 2.1-不可变集合
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口