从以前的程序中也能够总结出来通常面向链接的服务器程序的代码框架,通常的模型以下所示:算法
int main() { socket(…); bind(…); listen(…); while(1) { accept(…); while(1) { pead(…); process(…); write(…); } close(…); } return 0; }
这种面向链接的服务器有一个很大的弊端:服务器一次只能处理一个客户端的请求,只有在这个客户的全部请求都知足以后,服务器才能继续处理后面的请求。若是有一个客户端占用服务器,后边的客户机都不能工做。这样的模型效率过低,不适合实际使用。一种很好的解决办法就是使用并发服务器的框架,流程图以下:服务器
并发服务器的通常模型模型代码以下:并发
int main(void) { socket(…); bind(…); listen(…); while(1) { accept(…); if(forhk(…) == 0) { while(1) { close(…); read(…); process(…); write(…); } close(…); exit(…); } else close(…); } close(…); return 0; }
上边的模型中,子进程负责处理链接请求,所以关闭监听套接字;父进程继续监听链接请求,所以关闭链接套接字。当服务器程序退出后,则关闭监听套接字。因而可知,在并发服务器的代码框架中,套接字的建立和关闭也是一一对应的,可使用这种方法来检查本身的程序是否正确。框架
对于面向链接的服务器,并发服务器能够解决循环服务器客户机独占服务器的状况,可是也存在一些新的问题:socket
一、服务器要建立子进程来处理客户端的链接请求,可是建立子进程是一种很是消耗资源的操做。为了提升效率必须使用更好的算法。spa
二、子进程结束运行后,注意对其资源的回收,不然会形成大量的僵尸进程,这可能会致使系统崩溃。code
在使用并发服务器程序的代码框架的时候,须要注意上边这两个问题。blog