linux异步通信之epoll

news/2024/7/9 17:43:31 标签: epoll

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



转载于:https://www.cnblogs.com/snake-hand/archive/2012/08/13/2636229.html


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

相关文章

数据图与数据网的遍历关键算法:搭建,插入,搜索,删除,广度优先与深度优先(C)

图和往作为最一般的数据结构&#xff0c;在工程中十分常见。 本文采用邻接表方法&#xff0c;给出有向数据图和有向数据网的搭建&#xff0c;插入&#xff0c;搜索与删除的关键算法。 其他辅助函数与代码请读者自行完成。 另外&#xff0c;又再此基础上给出图和网的两种遍历核心…

题目:Bill的计数法

题目描述 自从上次怪异的科学狂人Jam创造了Jam数&#xff0c;身为他朋友的Bill(同样是一个科学狂人)心里便暗下决心&#xff0c;准备创造一个Bill数。在平时&#xff0c;Bill很喜欢和Jam做相反的事情&#xff0c;所以Bill数的定义便和Jam数定义相反&#xff0c;数全部用字母z,y…

无向数据网的最小代价生成树:Prim算法

额&#xff0c;教科书上的案例是错误的&#xff0c;Prim算法没有那么简单&#xff0c;短短的几行代码根本实现不了。不过仍然向它致敬&#xff0c;因为理论讲的很透彻&#xff0c;我也是根据理论写出来这个复杂代码的&#xff0c;本算法的基本数据结构是邻接表。 Prim算法简介&…

教务系统破解

来自 http://everet.org/# -*- coding:utf-8 -*- # 破解教务网密码 # 作者&#xff1a;华亮from HTMLParser import HTMLParser from Queue import Empty from Queue import Queue from re import match from sys import exit from urllib import urlencode import os import r…

ORA-00911错误及解决方法(另附所有ora错误原因及解决方法 网址)

今天在项目中遇到一个头疼的问题&#xff0c;Oracle数据库报告&#xff1a;ORA-00911错误。问题如下&#xff1a; 但是我在PL/SQL Developer中执行明明没有问题&#xff01;&#xff01;&#xff01; 问题出在哪里&#xff1f;&#xff1f;&#xff1f; 纠结了我很久&#xff0…

通过案例浅谈C++与Python的快速实现差别

本文以中彩票问题入手&#xff0c;即15个元素&#xff08;包含单个数字和字母&#xff09;中依次取出4个元素&#xff0c;每次取出后不放回。彩票的奖金序列为随意取定的4个元素&#xff08;包含单个数字和字母&#xff09;。要求程序返回中奖前运行的次数。 依据数学中的组合原…

Android关于自定义ExpandableListView样式

Android关于自定义ExpandableListView样式 创建项目&#xff1a;ExpandableListView 运行项目效果&#xff1a; 布局文件 main.xml <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools&…

C++基于多态的职工管理系统[某培训机构演示项目的全代码,bug已被修复,纯手打不易]

某培训机构基于C 多态而实现的职工管理系统&#xff0c;其中有两个小bug&#xff0c;已被修复。附源代码。 主入口&#xff1a; 职工管理系统.cpp #include<iostream> #include<fstream> #include "workerManager.h" using namespace std; //#include …