一、epoll

    1.epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用

    (1)int epoll_create(int size); 

    创建一个epoll的句柄。自从linux2.6.8之后,size参数是被忽略的。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。 

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

    epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。

    a.第一个参数是epoll_create()的返回值。 

    b.第二个参数表示动作,用三个宏来表示: 

    EPOLL_CTL_ADD:注册新的fd到epfd中;

    EPOLL_CTL_MOD:修改已经注册的fd的监听事;

    EPOLL_CTL_DEL:从epfd中删除一个fd; 

    c.第三个参数是需要监听的fd。

    d.第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:

wKioL1ecdsHC0wi5AAA0Ku1Oe_E425.jpg-wh_50

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

    收集在epoll监控的事件中已经发送的事件。参数events是分配好的epoll_event结构体数组,epoll将会把发生的事件赋值到events数组中(events不可以是空指针,内核只负责把数据复 制到这个events数组中,不会去帮助我们在用户态中分配内存)。maxevents告之内核这个 events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时 时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。如果函数调用成功,返回对应I/O上已准备好的文件描述符数目,如返回0表示已超时。

    2.Epoll的2种工作方式-水平触发(LT)和边缘触发(ET) 

    LT(level triggered)是epoll缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表. 

    ET (edge-triggered)是高速工作方式,只支持no-block socket,它效率要比LT更高。ET与LT的区别在于,当一个新的事件到来时,ET模式下当然可以从epoll_wait调用中获取到这个事件,可是如果这次没有把这个事件对应的套接字缓冲区处理完,在这个套接字中没有新的事件 再次到来时,在ET模式下是无法再次从epoll_wait调用中获取这个事件的。而LT模式正好相反,只要一个事件对应的套接字缓冲区还有数据,就总能从epoll_wait中获取这个事件。因此,LT模式下开发基于epoll的应用要简单些,不太容易出错。而在ET模式下事件发生时,如果没有彻底地将缓冲区数据处理完,则会导致缓冲区中的用户请求得不到响应。 

二、代码实现

wKiom1ecpATTlqfEAABg5EH6Cik069.jpg-wh_50

wKioL1ecpATgyeJ4AABsZKlFp6A262.jpg-wh_50

wKioL1ecpAXjkWtdAABOX4W4EpY305.jpg-wh_50

wKiom1ecpAWh1m4IAABhCV8iv_s114.jpg-wh_50

wKiom1ecpAaAYbqkAABzy0LIqXs566.jpg-wh_50

wKioL1ecpAbSrhj5AABgy4tTtZI271.jpg-wh_50

wKioL1ecpAfiA2BQAABR4Ar8CWw517.jpg-wh_50

三、结果显示

    1.通信结果

wKioL1ecpB3TQOgDAAAi4LYGX0o206.jpg-wh_50

wKiom1ecpB3QAwdqAAAguFJjP7g485.jpg-wh_50

    2.用浏览器测试简单http消息回显。 

wKiom1ecpDTQxowLAABiYvtVWqA843.jpg-wh_50