逐步实现TCP服务端Step04-8:epoll

epoll是对selectpoll的强化,是Linux(2.6内核开始支持)特有的机制。它有这么几个特点:1. 内核维护了一个事件列表用于记录各描述符上注册的事件,某个文件描述符上的事件只需向内核注册一次,不必像selectpoll那样每次调用都要向内核注册一遍;2. 监测结果集中只会给出就绪了的文件描述符;3. 支持ET工作模式。

这是在目前的程序(netio)结构下,使用select ...


逐步实现TCP服务端Step04-7:select、poll

select是最基本的I/O多路复用函数,Linux及Windows平台均提供支持。pollselect类似,二者的语义都是在给定的时间内对一组文件描述符进行遍历检查,找出其中的就绪者。

  • nfds:要求给出传入集合中最大的文件描述符值+1,内核需要知道这个值已确保其操作能涵盖结合中的所有文件描述符。
  • readfds/writefds/exceptfds ...


逐步实现TCP服务端Step04-6:I/O多路复用

I/O多路复用是一种I/O模式,由OS提供支持。基于该方式,可对多个I/O实施管理。

由进程发起的一次I/O操作,其执行包含两个阶段:1. 准备数据;2. 复制数据。处于用户空间的进程没有直接操作设备的权限,这两步操作都由内核完成。第一步所谓的准备数据,指的是内核将设备中的数据取到内核缓冲中。比如当收到一个完整TCP报文段时,其携带的数据会被存到内核缓冲中,此时的状态就是数据准备已就绪。第一步就绪后,第二步则会将内核缓冲中的数据拷贝到进程空间中的指定区域(用户缓冲 ...


逐步实现TCP服务端Step04-1:改造

目前的这版程序不支持多客户并发,并非由于结构的局限性导致的无法实现。而是由于在早期不想引入不相关的复杂度而故意没去做这部分内容。

现在进行改造。主要修改netio,将监听socket置为非阻塞,让accept也参与到主循环中来。另外,还需要一个容器来存放那些已被accept了的新socket 。

这个容器要能方便地删除元素(客户离线),同时支持随机访问。基于数组存储的链式结构可以满足需求。

基于C++模板实现了一个不关注元素具体类型的List类 ...


逐步实现TCP服务端Step03-15:小结

这是一个里程碑,到目前为止,基本的构件都已实现,为下一步的扩展打下了基础。

所谓的“扩展”是指把对单个客户的服务扩展为对n个客户,目前这个版本只针对一个客户。

再明确一下目标,我们要实现的是一个暂时不关注具体业务的基于TCP连接的后端系统。所谓的“不关注具体业务”,就是说要做的“抽象”一些。它更像是一个骨架,如果需要的话,可以把具体的业务逻辑填充进去 ...


逐步实现TCP服务端Step01:原始阶段

原始阶段:服务端一次只受理一个客户,在对当前客户服务期间,其他客户没机会连进来。这个阶段的服务端做的事情非常简单,就是将收到的字节原封不动地返回去。

由于没有定义消息格式,现阶段不需要实现专用的client程序,测试的时候直接使用telnet或者netcat就可以:

telnet ip port
nc ip port

这里及后续的实现代码都是比较粗糙的,只是为了说明问题,没有做太多的考虑。程序中也没有日志输出,只是个别要关注的地方做了标准输出 ...