1. 引言
前面的文章已经讲了如何搭建一个多线程/多进程的服务器模型,可以支持多个客户端同时连接服务器, 本篇来实现一种单进程的非阻塞轮询机制的服务器模型。
之前文章连接:
《Socket编程 | TCP编程基本流程和API详解-1》
《Socket编程 | TCP服务端阻塞IO模型(多线程)-2》
《Socket编程 | TCP服务器IO模型之并发阻塞(多进程实现)-3》
2. 概念理解
之前多线程/多进程服务器模型都是基于阻塞IO的机制实现的,本次测试以非阻塞IO为基础,服务端轮询的检测客户端的连接,关于阻塞与非阻塞的概念解释如下:
2.1 阻塞I/O模型:
进程会一直阻塞,直到数据拷贝完成。
应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。
当调用recv()/read()函数时,系统首先查是否有准备好的数据。如果数据没有准备好,那么系统就处于等待状态。当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。
当使用socket()函数创建套接字时,默认的套接字都是阻塞的。并不是所有 Sockets API以阻塞套接字为参数调用都会发生阻塞。例如,以阻塞