linux异步通信之epoll【转】

news/2024/7/9 17:24:10 标签: epoll

转自:http://www.cnblogs.com/snake-hand/archive/2012/08/13/2636229.html

1、简介

epoll是linux提供的一种异步的I/O通知方式,相比较于select机制而言,select是轮询的,而epoll是触发式的,而且select的最大连接数只有1024,超过这个限制后就只能使用多进程来操作了。所以epoll的效率相对而言更高。

2、主要函数

epoll_create      创建epoll

epoll_ctl       把某个句柄添加到epoll里面

epoll_wait       等待epoll事件的产生。只要注册的句柄发生了变化即会检查到有epoll事件的产生。

3、主要流程

 

    /* 创建EPOLL*/
    iEpollFd = epoll_create(MYPING_EPOLLEVENT_MAX);
    /* 设置sicket选项 */
    stServaddr.ucLen = sizeof(stServaddr);
    stServaddr.ucFamily = (UCHAR)AF_LIPC;
    stServaddr.usPort   = htons(LIPC_GLOBAL_PORT_MYPING);
    stServaddr.usAddr   = htons(LIPC_LIP_ADDR_ANY);

    /* 创建 socket */
    iLipcFd = socket(PF_LIPC, SOCK_DGRAM, LIPC_PROTO_STCP);
    /* bind socket */
    iRet += bind(iLipcFd, (struct sockaddr *)(&stServaddr), (UINT)sizeof(LIPC_SOCK_ADDR_S));
    
    /* listen socket */
    iRet += listen(iLipcFd, SOMAXCONN);

    /* bind or listen error */
    if(0 != iRet)
    {
        printf("bind or listen socket failed\r\n");
        (VOID)close(iLipcFd);
        return ERROR_FAILED;
    }

    /* regist socket to epoll */
    iRet = MYPING_EpollReg(EPOLLIN, iLipcFd, MYPING_LipcListenCallback);
    if(0 != iRet)
    {
        printf("regist lipc socket to epoll failed\r\n");
        (VOID)close(iLipcFd);
        return ERROR_FAILED;
    }
    /* 等待事件的产生 */
    for(;;)
    {
        /* this will be blocked until any registered event happend or timeout */
        iNfds = epoll_wait(g_iEpollHandle, astEpEvt, MYPING_EPOLLEVENT_MAX, -1);


        /* 轮询产生的事件 */
        for(i = 0; i < iNfds; i ++)
        {
            /* 获取注册的回调函数 */
            pfCallback = (VOID *)(ULONG)astEpEvt[i].callback;

            /* 调用相关的回调函数进行处理  */
            pfCallback(astEpEvt[i].events, astEpEvt[i].data.fd);
        }
    }

4、机制

实际上一般先在epoll上面注册一个监听的socket,当这个socket监听到有数据连接时,即创建一个新的socket来接收数据,然后把这个新的socket的句柄注册到epoll上面去,再在这个 socket的回调函数里面来做相应的处理。

 








本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5847477.html,如需转载请自行联系原作者



http://www.niftyadmin.cn/n/978363.html

相关文章

微信调试模式,线上转为线下调试模式

微信消息调试&#xff1a;include_once Base/jssdk.php;$jssdk new \JSSDK(C(Wechat)[AppID], C(Wechat)[AppSecret]);$url http://192.168.71.24/demo/wechat/listener; //DM个人信息url$header[] "Content-type: text/xml";//定义content-type为xml$header[] &…

五、System Center Virtual Machine Manager 2012 创建“云”

创建云&#xff0c;微软的云好比ESXi的群集高可用性DRS&#xff0c;好比Xenserver的群集高可用性资源分配。这里创建一个云 本文转自 mabofeng 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/mabofeng/689748 &#xff0c;如需转载请自行联系原作者

百度医疗广告卷土重来_意见3d电视值得卷土重来的时间

百度医疗广告卷土重来3D TV’s promised a lot to its early adopters, from live sports to a dream cinematic experience, its time for companies to reincarnate its offering.从现场体育到梦幻般的电影体验&#xff0c;3D TV为其早期采用者带来了很多希望&#xff0c;是公…

晚秋

夜露凝霜虫已休&#xff0c; 月隐星暗独行舟。 浆橹轻拽莲下水&#xff0c; 涟漪幻出一晚秋。

十五、Spring Boot 环境变量读取 和 属性对象的绑定

凡是被spring管理的类&#xff0c;实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时&#xff0c;获取到系统环境变量和application配置文件中的变量。 如&#xff1a; Configuration public class MyWebAppConfigurer implements EnvironmentAware { priva…

WINDOWS系统中自带的IExpress实验

WINDOWS系统中自带的IExpress实验 木马传播最惯用的手段就是将木马程序和合法程序捆绑在一起&#xff0c;当合法程序程序运行后也触发木马程序运行。WINDOWS系统中自带的IExpress就有此功能&#xff08;据说还能抗查杀&#xff0c;有机会要试一下呢&#xff09;是这样的吗&…

在短短6个月内发烧相机已成为成熟的行业

重点 (Top highlight)In October 2016, a Shenzen-based video surveillance company called Sunell set up an experiment: It installed thermal cameras and facial recognition in the entrances of six schools in northern Beijing.2016 年 10月&#xff0c;总部位于深圳…

Dojo的dojoConfig函数

在我们引入 Dojo 的时候都会先做一些全局的配置&#xff0c;所使用的就是 Dojo 的 Config 接口。 dojoConfig为以前的dgConfig函数。 <script type"text/javascript">djConfig {parseOnLoad: true,// 解析页面上的 widgetsisDebug: false,//设为“true”则会进…