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

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

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

  1. 缺省即默认:当你调用epoll_createepoll_ctl添加节点时,如果不加特殊标志,默认就是 LT 模式。
  2. 兼容性强:它同时支持阻塞(Block)和非阻塞(No-Block)套接字。
  3. 核心工作机制(极其重要):
    • 读事件(EPOLLIN):只要内核读缓冲区里还有数据没被取走epoll_wait()就会持续不断地解除阻塞,通知应用程序去读。
    • 写事件(EPOLLOUT):只要内核写缓冲区还有可用空间epoll_wait()就会持续通知。(注:实际开发中通常不监听写事件,防止 CPU 空转)。
  4. 处理灵活性:正因为内核会反复通知,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>#definePORT8989// 笔记要求的端口intmain(){// 1. 创建套接字并绑定监听intlfd=socket(AF_INET,SOCK_STREAM,0);intopt=1;setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));structsockaddr_inaddr;memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=INADDR_ANY;