欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Linux下多任务编程(网络编程2)

Linux下多任务编程(网络编程2)

2024/11/5 18:08:37 来源:https://blog.csdn.net/afdtsadfasudfasu/article/details/142812850  浏览:    关键词:Linux下多任务编程(网络编程2)

前言

        本文介绍解决accpet和recv相互阻塞的问题,可以用多线程并发外也可以用epoll I/O多路复用的方式解决。

epoll I/O多路复用

I/O多路复用原理

        因为accept和recv相互阻塞,并且无法确定那个函数先执行,所以代码无法直接写

        accept阻塞是sockfd带来饿,recv阻塞是newfd带来的

        核心思想:所以需要一个工具,将sockfd和newfd统一监管,哪个fd发生了事件(连接事件和收数据事件),就把哪个fd通知给用户,用户程序再调用对应的处理函数去处理。

        多路IO复用的方法:select、poll、epoll

select poll epoll的区别(重点)

        select和poll是轮询模式(顺序查找,全过一遍)
        epoll是事件(告诉谁需要先处理,哈希查找)

selectpollepoll
监控机制线性表遍历方式同select,解决了select文件描述符数量的限制基于事假
性能当文件描述符数量增加时,性能线性下降同select,但没有文件描述符数量的限制性能不随监控的文件描述符数量增加而显著下降,适合大规模文件描述符的监控
最大文件描述符数量有限制,通常为1024无硬性限制,但大量文件描述符会导致性能下降无硬性限制,理论上受内存大小限制
可移植性跨平台,广泛支持跨平台,广泛支持主要在Linux系统中支持,其它系统的支持不高

epoll工作原理

epoll相关函数

epoll_create函数

#include <sys/epoll.h>
int epoll_create(int size);
//例子
int epfd = epoll_create(10);

        功能:创建epoll

        参数:大于0即可,epoll能存储的fd个数是动态增加的
        返回值:≥0 代表epoll的文件描述符,<0 创建失败 

epoll_ctl函数

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

        功能:向epoll中添加/删除一个fd

        参数1:epoll_create的返回值
        参数2:EPOLL_CTL_ADD        添加
                     EPOLL_CTL_DEL        删除
        参数3:待添加的文件描述符fd
        参数4:待添加fd的相关属性

epoll_wait函数

UDP广播

UDP组播

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com