Linux服务器模型及其对应的程序流程
一、TCP循环服务器
TCP循环服务器一次只能处理一个客户端的请求,处理完成后,才能接受下一个客户端的请求,程序流程如下:
socket(......);//创建套接字 bind(......);//绑定到某端口 listen(......);//监听客户端连接 while(1)//循环处理客户端的请求 { accept(......);//接受一个客户端连接 while(1)//处理客户端的请求 { recv(......); process(......); send(......); } close(......);//关闭当前客户端连接 }
二、UDP循环服务器
UDP循环服务器每次从套接字上读取一个客户端的请求并处理,然后将结果返回给客户机,程序流程如下:
socket(......);//创建套接字 bind(......);//绑定到某端口 while(1)循环处理客户端的请求 { recvfrom(......); process(......); sendto(......); }
三、并发处理器
并发处理器是指服务器在同一个时刻可以响应多个客户端的请求,他的思想是每一个客户端的请求并不由服务器进程直接处理,而是创建一个子进程来处理,这可以弥补TCP循环服务器容易出现某个客户端独占服务端的缺陷,程序流程如下:
socket(......);//创建套接字 bind(......);//绑定到某端口 listen(......);//监听客户端连接 while(1)//循环处理客户端的请求 { accept(......);//接受一个客户端连接 if(fork(......)==0)//创建子进程 { while(1)//处理客户端的请求 { recv(......); process(......); send(......); } close(......);//关闭当前客户端的连接 exit(......);//子进程退出 } close(......);//父进程关闭连接套接字,准备接受下一个客户端连接 }
四、多路复用I/O并发服务器
多路复用I/O并发服务器是为了解决创建子进程带来的系统资源消耗问题而提出的,前面几种服务器都是阻塞方式的套接字,使用阻塞方式的套接字,进程的效率比较低,尤其是进行读写操作时。我们可以使用fcntl()或ioctl()函数来改变套接字的属性,将其设置为无阻塞方式,程序流程如下:
socket(......);//创建套接字 bind(......);//绑定到某端口 listen(......);//监听客户端连接 while(1)//循环处理客户端的请求 { FD_SET(......);//设置监听读写文件描述符 switch(select(......))//调用select函数 { case -1://发生错误,退出 exit(1); case 0://超时 break; default: if(.....)//新的连接请求建立 { accept(......);//接受一个客户端连接 FD_SET(......);//将连接套接字加入到监听文件描述符集合中 } else//可读写的为一个已经创建过连接的描述符 { ......//读写套接字 } } }