为什么需要 EPOLLONESHOT? epoll 有两种触发的方式:LT(水平触发)和ET(边缘触发)。对于前者,只要存在着事件就会不断的触发,直到处理完成;而后者只触发一次相同事件,或者说只在从非触发到触发两个状态转换的时候才触发。 想象这样一种情况,当前是多线程在处理,一个 socket 事件到来,数据开始解析。这时候这个 socket 又来…
Linux Server epoll实现多路复用 Windows Client 初始化Windows下的socket环境 #pragma comment(lib, "Ws2_32.lib") int main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequeste…
要点 1.服务器程序通常需要处理三类事件:I/O事件,信号及定时事件。有两种事件处理模式: Reactor模式:要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生(可读、可写),若有,则立即通知工作线程(逻辑单元),将socket可读可写事件放入请求队列,交给工作线程处理。 Proactor模式:将所有的I/O操作都交给主线程和内核来…
线程池并发服务器 为什么要引入线程池,不直接用之前的多线程并发? 因为多线程并发要频繁地对线程进行创建与销毁(一旦有客户端传来需求,就创建一个新线程,通信结束就立刻销毁该线程),这会占用大量的CPU时间并导致不必要的系统开销 相关结构体 线程池结构体:描述线程池相关信息 pthread_mutex_t lock; /* 用于锁住本结构体 */ pt…
多进程并发服务器 思路 ①Socket(); 创建监听套接字lfd(首字母大写是因为调用的自封装函数) ②Bind(); 绑定地址结构 Strcut sockaddr_in addr; ③Listen(); 设置监听上限 ④ while (1) { cfd = Accpet(); //接收客户端连接请求 pid = fork(); if(pid =…