欢迎光临
我们一直在努力

理论剖析:什么是 LT 水平触发模式?

一、 理论剖析:什么是 LT 水平触发模式?

在正式撸代码之前,我们先明确笔记中关于 LT 模式的核心定义:

  • 缺省即默认: 当你调用 epoll_create 和 epoll_ctl 添加节点时,如果不加特殊标志,默认就是 LT 模式。
  • 兼容性强: 它同时支持阻塞(Block)和非阻塞(No-Block)套接字。
  • 核心工作机制(极其重要):
    • 读事件(EPOLLIN): 只要内核读缓冲区里还有数据没被取走,epoll_wait() 就会持续不断地解除阻塞,通知应用程序去读。
    • 写事件(EPOLLOUT): 只要内核写缓冲区还有可用空间,epoll_wait() 就会持续通知。(注:实际开发中通常不监听写事件,防止 CPU 空转)。
  • 处理灵活性: 正因为内核会反复通知,LT 模式允许我们将一个大的数据包分多次读取,容错率极高。

  • 二、 极限测试实验:5 字节缓冲区的挑战

    为了直观验证 LT 模式的“持续通知”特性,我们设计了以下实验:

    • 客户端: 一次性发送一段较长的数据(例如:hello,world.你好,世界)。
    • 服务器: 每次 epoll_wait 唤醒后,故意只用一个 5 字节的缓冲区去 recv 接收数据。

    按照理论,如果客户端发了 20 多字节,服务器每次只读 5 字节,那么 epoll_wait 应该会被连续唤醒 5 到 6 次,直到数据彻底被读干净。

    1. 服务器端代码 (epoll_server_lt.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <sys/epoll.h>

    #define PORT 8989 // 笔记要求的端口

    int main() {


    // 1. 创建套接字并绑定监听
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    int opt = 1;
    setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = INADDR_ANY;

    赞(0)
    未经允许不得转载:171主机测评 » 理论剖析:什么是 LT 水平触发模式?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址