设计要点
设计Server时需要考虑的因素
响应速度(新建连接时、发送数据时) | |
运行速度 | |
I/O吞吐量 | |
其它:流量控制(QoS)、安全性 | |
针对特定协议的数据结构 |
多线程 | |
多进程 | |
单进程 |
TCP流模式 或 UDP数据报模式 | |
阻塞函数 或 非阻塞函数 | |
同步I/O模式 或 异步I/O模式 |
程序结构
多进程:
在主进程调用accept()函数生成一个新的连接后,调用fork()产生一个子进程对这个新连接进行操作
在主进程结束前需要向所有子进程发中断信号并等待所有子进程执行完毕。
这种程序结构最简单,例子可以参照前面TCP Server的结构和代码。
主要应用于各连接操作相互独立的Server,可以保证各连接相互间的数据安全性, 如telnetd、FTPd等。
多线程:
基本与多进程结构类似,但是在获得新连接时生成一个线程来对这个连接进行处理。
主要的优点:
线程调度速度快,占用资源少 线程可共享进程空间中的数据 主要应用于各个连接之间关系较紧密的Server,例如:BBS Server
Server的响应速度和I/O吞吐量均较好,是最常用的程序结构。但是在Linux环境下,由于系统用进程来模拟线程,因此程序性能并不比多进程结构强。
单线程:
通过select实现非阻塞的同步I/O模式
可以通过调用select函数得出需要读数据并处理的socket集合(也就是Client的集合),然后依次对每个socket读数据,处理并向socket写结果
select得到的socket列表中有一个特殊的socket就是listen函数使用的socket,这个socket需要单独处理,调用accept生成新的socket连接并将这个新socket加入已有的socket集合。
该结构对算法效率要求较高,一般来说响应速度慢,但I/O处理速度最快。适用于连接数少、数据吞吐量大的Server
设计Server的程序结构
程序结构的考虑
网络函数的考虑