Linux epoll 网络通信编程

底层原理:建立e_poll file事件文件,通过e_poll_fd 来管理e_poll,将socket转换成epoll_event ,把epoll_event 放入e_poll file中,通过监听e_poll_fd 来寻找到epoll_event 所对应的socket

  1. 建立e_poll file

    • epoll_create()
  2. 设置对象

    • epoll_fd
    • epoll_event
  3. 添加 epoll_event 到 e_poll file中

    • epoll_ctl()
  4. 使用epoll file

    • epoll_wait()

#include 头文件

epoll_create() 创建epoll

epoll_create(int size)

功能:该函数生成一个epoll专用的文件描述符

  • size: 预计监听多少事件 随便填

  • 返回值:epoll_fd

对象 epoll_fd / epoll_event

  • struct epoll_event
  1. struct epoll_event {
  2. __uint32_t events; //当前事件类型
  3. epoll_data_t data; //操作句柄 epoll_data
  4. };
  5. 事件类型有:
  6. EPOLLIN :输入事件;
  7. EPOLLOUT:输出事件;
  8. EPOLLPRI:紧急事件,优先处理;
  9. EPOLLERR:错误事件;
  10. EPOLLHUP:挂起事件;
  11. EPOLLET 设置为边沿事件,不设置为电频事件;
  12. 边沿事件 0 1出发
  13. 电频事件 有事件就触发
  14. 操作句柄: epoll_data
  15. typedef union epoll_data {
  16. void *ptr;
  17. int fd; // 监听句柄
  18. __uint32_t u32;
  19. __uint64_t u64;
  20. } epoll_data_t; //保存触发事件的某个文件描述符相关的数据

epoll_ctl() 添加epoll_event 函数

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

功能:用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件

  • epfd:要添加的 epoll_fd
  • op:要执行的事件 ,添加,删除,修改

    • EPOLL_CTL_ADD 添加
    • EPOLL_CTL_MOD 修改
    • EPOLL_CTL_DEL 删除
  • fd:事件所监听的fd
  • epoll_event :添加的 epoll_event

epoll_wait() 启动使用epoll

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

功能:启动监听epoll

  • epfd:要监听的 epoll file
  • *epoll_event :返回的 epoll_event
  • maxevents:最大事件
  • timeout:超时时间
  • 返回值,指的是就绪事件的个数

int fl = fcntl(sock,F_GETFL); // 获取sock的文件属性

fcntl(sock,F_SETFL,fl|O_NONBLOCK);//设置 为非阻塞IO