关于C++网络编程中Epoll和套接字阻塞与非阻塞有感

发布时间:2026/7/19 3:34:08
关于C++网络编程中Epoll和套接字阻塞与非阻塞有感 前情提要小编本人是刚开始学C网络编程的学生来记录一下学习笔记大家如果看到有错误请不要吝啬您的指导助力每一位it追梦人我们创建的套接字不管是连接套接字Acceptor_fd还是客户端套接字Client_fd都会放到Epoll中来进行管理Epoll是Linux内核自带的里面有一个红黑树来管理我们的套接字。他最主要的一个功能就是将有事件发生的套接字给返回出来我们一般用一个数组Events来承接这样我们就不需要便利每一个套接字fd了只需要处理这个数组里面的即可。套接字阻塞阻塞就是你用read()的时候如果读缓冲区里面没有数据他就会一直在那里面等着这样我们Events里面的其他套接字就要跟他一直在那里等。如果说客户端连接比较少的情况下还可以考虑那么如果有成千上万个呢这个时候我们就要想办法了。套接字非阻塞非阻塞比阻塞多了一个东西如果缓冲区读取完了会返回一个EAGIN我们只许哟啊加上一个判断if (errno EAGAIN || errno EWOULDBLOCK)这样我们就读完数据就可以安全的退出了不影响其他的fd处理。Epoll水平触发LT水平触发坦白说就是他会一直通知你如果你没有把数据读完下一次调用epoll_wait()时会立即返回再次告诉你这个 fd 可读也就是“持续通知”Epoll边缘触发ET边缘触发相对于水平触发他只会通知你一次即使缓冲区里面还有数据也不会再次通知你所以你需要保证他通知你一次然后你一次性的把数据给拿完。因为我们用到ET他只会通知一次你必须得循环的去取数据如果你用阻塞的话缓冲区没有数据它会一直阻塞在那里所以我们的ET必须搭配非阻塞这在下边也会有提到。经典配合1LT阻塞 如果说在我么们平常的学习当中客户端非常的少并发量比较小的情况下可以使用代码最简单线性逻辑。AI给出的连接数量建议是500经典配合2 ET非阻塞优点就是每个事件只通知一次在成千上万的高并发服务器中大大减少了通知的次数但是这个需要我们的代码复杂度比较高.AI给出的连接数量建议是10000配合3LT非阻塞适合中等数量的连接只开一个线程但是通知次数多。AI给出的连接数量建议是500~2000重点 阻塞因为read会卡在那里等待缓冲区有数据所以需要有几个连接就开几个线程但是线程熟练后膨胀会导致cpu调度崩溃内存爆炸不建议这样。如果是LT就无所谓读一次就可以退出反正epoll会产生事件。心得体会1.使用LT阻塞与非阻塞无所谓2.使用ET必须配合非阻塞循环read3.使用阻塞在循环read的时候必须要每个连接单开线程多线程4.使用非阻塞单线程处理处理多连接多线程也可以没有必要这四条是小编总结的黄金法则总结ET比LT高效因为通知的次数大幅度降低。非阻塞比阻塞灵活因为它不会在那里死等。具体情况还需要具体讨论情况复杂多变。