多进程:
在主进程调用accept()函数生成一个新的连接后,调用fork()产生一个子进程对这个新连接进行操作 在主进程结束前需要向所有子进程发中断信号并等待所有子进程执行完毕。 这种程序结构最简单,例子可以参照前面TCP Server的结构和代码。 主要应用于各连接操作相互独立的Server,可以保证各连接相互间的数据安全性, 如telnetd、FTPd等。
在主进程调用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
通过select实现非阻塞的同步I/O模式
可以通过调用select函数得出需要读数据并处理的socket集合(也就是Client的集合),然后依次对每个socket读数据,处理并向socket写结果
select得到的socket列表中有一个特殊的socket就是listen函数使用的socket,这个socket需要单独处理,调用accept生成新的socket连接并将这个新socket加入已有的socket集合。
该结构对算法效率要求较高,一般来说响应速度慢,但I/O处理速度最快。适用于连接数少、数据吞吐量大的Server