Linux系统网络服务器模型主要有两种,循环服务器和并发服务器。所谓循环服务器是指在同一时刻只可以响应一个客户端的请求;而并发服务器是指服务器在同一个时刻可以响应多个客户端的请求。
TCP循环服务器
TCP循环服务器的实现比较简单。首先TCP服务器接受一个客户端的连接,处理连接请求,在完成了这个客户的所有请求后再接受下一个客户端的请求。 主要过程如下:
socket(...); //创建一个TCP套接字 bind(...); //绑定公认的端口号 listen (...) ; //倾听客户端连接 while(1) //开始接收客户端连接 { accept(...); //接收一个客户端连接 while(1) { //处理当前客户端连接 read(...); process(...); write(...); } close(...); //关闭当前客户连接 }
TCP循环服务器一次只能处理一个客户端的请求,只有处理完当前客户端的请求才能继续后面的请求。
TCP并发服务器
TCP循环服务器容易引起某个客户机独占服务器,为了弥补这个缺陷,我们采用并发服务器的模型。并发服务器的思想是每一个库户籍的请求并不由服务器主进程直接处理,而是服务器主进程创建一个子进程来处理。主要过程如下:
socket(...); //创建一个TCP套接字 bind(...); //绑定公认的端口号 listen (...) ; //倾听客户端连接 while(1) //开始并发接收客户端连接 { accept(...); //接收一个客户端连接 if(fork()==0) //创建一个子进程 { while(1) { //子进程处理某个客户端连接 read(...); process(...); write(...); } close(...); //关闭子进程处理的客户端连接 exit(...); //终止该子进程 } close(...); //父进程关闭连接套接字 }
TCP并发服务器可以同时响应多个客户端请求,当是创建子进程对于系统来说也是个不小的开销。
UDP循环服务器
使用UDP套接字实现循环服务器很简单,UDP服务器每次从套接字上读取一个客户端的数据报请求,处理接收到的UDP数据报,然后将结果返回给客户机。主要过程住下:
socket(...); //创建一个UDP套接字 bind(...); //绑定公认的端口号 while(1) //开始接收客户端连接 { //接收和处理UDP数据报 recvfrom(...); process(...); sendto(...); //准备接收下一个客户端的数据报 }
由于UDP是非面向连接的,没有一个客户端可以独占服务器,只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足的。
UDP并发服务器
当数据报流量过大,处理时间较长时,这时候可以考虑使用并发的方式来处理。和前面的TCP并发服务器一样,也通过创建子进程处理的方式来实现UDP并发服务器,主要过程如下:
socket(...); //创建一个UDP套接字 bind(...); //绑定公认的端口号 while(1) //开始接收客户端连接 { recvfrom(...)//接收一个UDP数据报 if(fork()==0) //创建一个子进程来处理接收的UDP数据报 { process(...); sendto(...); } }