博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux异步通信之epoll【转】
阅读量:6219 次
发布时间:2019-06-21

本文共 1764 字,大约阅读时间需要 5 分钟。

 

转自:

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的回调函数里面来做相应的处理。

 

转载地址:http://fgoja.baihongyu.com/

你可能感兴趣的文章
WPF 控件自定义背景
查看>>
年终盘点丨细数2018云栖社区12大热点话题
查看>>
Python零基础学习代码实践 —— 打印5位数的回文数并统计个数 ...
查看>>
联想手机首发高通旗舰处理器骁龙855,能否借此打出一场翻身仗? ...
查看>>
阿里云MVP:阿里云高可用架构的设计
查看>>
Linux基础命令---文本显示look
查看>>
图数据库HGraphDB介绍
查看>>
互联网装修O2O模式是否可行?
查看>>
在Linux上安装Git
查看>>
揭开数据库RPO等于0的秘密(下)
查看>>
Android Button
查看>>
“死”法不重样,一根数据线如何从“机器伴侣”变身电脑杀手?
查看>>
CountDownLatch详解
查看>>
云时代重新定义主机安全:自动化安全闭环是核心
查看>>
abap选择屏幕工具栏按钮问题
查看>>
【Java】I/O类库
查看>>
WPF 4 Ribbon 开发 之 标签工具栏(Tab Toolbar)
查看>>
传闻 Android Q 将支持手机应用版本回滚
查看>>
Visual Studio Code 1.33 发布
查看>>
jQuery幻灯片播放器插件
查看>>