一、 理论剖析:什么是 LT 水平触发模式?
在正式撸代码之前,我们先明确笔记中关于 LT 模式的核心定义:
- 读事件(EPOLLIN): 只要内核读缓冲区里还有数据没被取走,epoll_wait() 就会持续不断地解除阻塞,通知应用程序去读。
- 写事件(EPOLLOUT): 只要内核写缓冲区还有可用空间,epoll_wait() 就会持续通知。(注:实际开发中通常不监听写事件,防止 CPU 空转)。
二、 极限测试实验: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;

