epoll实现相关学习笔记

epoll的相关知识学习笔记

  1. 为什么在自己实现的TCP协议栈中不能直接使用系统的epoll

    1. 此处fd不是系统的fd

    2. 用户态fd只是一个int

    3. epoll是应用程序和协议栈之间的一个组件

    4. 需要实现的函数:

    1. epoll_create

      1. 创建eventpoll,创建fd
    2. epoll_ctl

    3. epoll_wait

    4. epoll_event

    5. epollin/epollout

  2. 如何使得多个客户端同时连接:

在这里插入图片描述

  • 一个tcb对应一个fd,epoll检测tcb有没有事件,并管理fd;

  • 协议栈 tcpserver使用两个线程进行工作;

  • callback相当于生产者的动作,epoll_wait()相当于消费者的动作;

  • 协议栈将信息传输到epoll使用一个回调函数、

  • 触发回调函数的情况

    • 三次握手

    • established

    • fin()

    • 接受到数据的时候

    • 回调实现的就是往epoll加入节点

  • 水平触发:就是协议栈有数据就一直调用callback

  • 边缘触发:就是没有数据到有数据的状态出现时才调用callback

  • 协议栈没有io的概念

  • 需要支持查找频率很高的数据结构:红黑树、哈希、B树、B+树

    • 哈希一开始占用的内存比较大,不合适

    • Btree和b+tree 查找性能不如rbtree,适合做磁盘索引

  • epitem是红黑树的节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
epoll是一种I/O多路复用技术,主要用于在一个进程中管理多个socket的监听。它的作用是通过注册和监听多个socket,实现同时处理多个网络事件的能力。在常用的TCP/UDP程序中,如果只有一个socket,不需要使用epoll。但是如果有多个socket,就可以使用epoll来管理这些socket。 epoll主要由两个结构体组成:eventpoll和epitem。eventpoll是每一个epoll所对应的事件,而epitem是每一个IO所对应的事件。当调用epoll_ctl的EPOLL_CTL_ADD操作时,需要创建一个epitem来注册一个socket到epoll中。而通过调用epoll_wait方法可以获取已经监听到的事件。 下面是一个示例代码,展示了如何使用epoll实现socket监听: ``` // 创建一个epoll对象 int epollFd = epoll_create(1); // 创建一个socket int listenSocket = socket(AF_INET, SOCK_STREAM, 0); // 设置socket为非阻塞模式 fcntl(listenSocket, F_SETFL, O_NONBLOCK); // 创建一个epoll_event结构体 struct epoll_event listenEvent; listenEvent.data.fd = listenSocket; listenEvent.events = EPOLLIN | EPOLLET; // 监听读事件,并设置为边沿触发模式 // 将socket注册到epollepoll_ctl(epollFd, EPOLL_CTL_ADD, listenSocket, &listenEvent); // 开始监听事件 struct epoll_event events[MAX_EVENTS]; while (true) { int readyEventCount = epoll_wait(epollFd, events, MAX_EVENTS, -1); if (readyEventCount == -1) { // 发生错误,处理错误逻辑 break; } // 处理就绪的事件 for (int i = 0; i < readyEventCount; ++i) { if (events[i].data.fd == listenSocket) { // 监听socket有新的连接请求,处理连接逻辑 } else { // 其他socket有数据可读,处理读取逻辑 } } } // 关闭epoll和socket close(epollFd); close(listenSocket) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值