透析Linux网络服务器模型


  Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。
  
  所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。
  
  1、TCP循环服务器:
  
  首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。
  
  创建TCP循环服务器的算法如下:socket(……);//创建一个TCP套接字bind(……);//邦定公认的端口号listen(……);//倾听客户端连接while(1)//开始循环接收客户端连接{accept(……);//接收当前客户端的连接while(1)
  
  {//处理当前客户端的请求read(……);process(……);write(……);}close(……);//关闭当前客户端的连接,准备接收下一个客户端连接}TCP循环服务器一次只处理一个客户端的请求,如果有一个客户端占用服务器不放时,其它的客户机连接请求都得不到及时的响应。因此,TCP服务器一般很少用循环服务器模型的。
  
  2、TCP并发服务器:
  
  并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。
  
  创建TCP并发服务器的算法如下:socket(……);//创建一个TCP套接字bind(……);//邦定公认的端口号listen(……);//倾听客户端连接while(1)//开始循环接收客户端的接收{accept(……);//接收一个客户端的连接if(fork(……)==0)//创建子进程{while(1)
  
  {//子进程处理某个客户端的连接read(……);process(……);write(……);}close(……);//关闭子进程处理的客户端连接exit(……);//终止该子进程}close(……);//父进程关闭连接套接字描述符,准备接收下一个客户端连接}TCP并发服务器可以解决TCP循环服务器客户端独占服务器的情况。但同时也带来了一个不小的问题,即响应客户机的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。
  
  3、UDP循环服务器:
  
  UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。
  
  创建UDP循环服务器的算法如下:socket(……);//创建一个数据报类型的套接字bind(……);//邦定公认的短口号while(1)//开始接收客户端的连接{//接收和处理客户端的UDP数据报recvfrom(……);process(……);sendto(……);//准备接收下一个客户机的数据报}因为UDP是非面向连接的,没有一个客户端可以独占服务器。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够处理的。