这个系列的上一篇文章讲了套接字联网API在服务端和客户端的几个主要函数。 这篇文章用来实现,顺便说一下select模型,也在下面的代码中用到。
///
select模型出现的真正原因在网上一直找不到,经过仔细思考其实只有一个,就是解决异步的问题;而且这个select是要结合多线程的。下面对这些进行说明。
1) 当使用阻塞 I/0时, 当阻塞在输入的时候无法进行读取的监听;
2) 当使用非阻塞I/O时,会在读取的监听上消耗CPU的资源。 其实这种情况即使忽略消耗的CPU资源,也是不能实现异步的。
3) 这时可能会考虑到使用多线程,就是让读取的监听 和 输入放在不同的线程中。
比如采用select监听一个套接字, 如果返回一个结果,就开辟一个新线程用来进行交互,假设这个新的线程阻塞在输入上,监听线程还是能够监听的,如果收到了一个FIN,能够及时的终止这个新的线程。 这就是select的作用,但是是不是每个连接都要设置一个select? 不用的,之需要在全局的主线程设置一个select就可以了,每当一个连接建立,就信开辟一个线程,主线程仍然在监听;而它又收到监听描述符上的信息后(比如FIN报文),就会对该描述符对应的线程进行处理。
下面是select的一个模型,分为服务端和客户端,有详细的注释。
服务端流程如下: 只发了一个文件,目的是弄清流程
#include <stdio.h>
#include <stdlib.h>
#include "server.h"
#include "