Linux网络编程中的几种简单服务器模型

本文最后更新于2017年8月6日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

之前只是在看书的时候简单了解过几种网络服务器并发编程模型,但是细节什么的也不清楚,最近在碰到相关问题的时候想着再去了解、学习一下。接下来,主要以在「常见网络服务器并发编程模型」看到的内容为引子进行学习。

正文:

参考解答:
/*
循环式/迭代式服务器:UDP服务器
UDP循环服务器的实现非常简单:UDP服务器每次从套接字上读取一个客户端的请求,处理,然后将结果返回给客户端。因为UDP是非面向连接的,没有一个客户端可以老是占住服务端。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足。可以用下面的算法来实现:
*/
socket();
bind();
while(1) {
	recvfrom();
	process();
	sendto();
}

/*
循环式/迭代式服务器:TCP服务器
TCP循环服务器的实现也不难:TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。
TCP循环服务器一次只能处理一个客户端的请求,只有在这个客户的所有请求都满足后,服务器才可以继续后面的请求。这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了。因此,TCP服务器一般很少用循环服务器模型的。
*/
socket();
bind();
listen();
while(1) {
	accept();
	while(1) {
		read();
		process();
		write();
	}
	close();
}

/*
并发服务器:TCP服务器
为了弥补循环TCP服务器的缺陷,人们又想出了并发服务器的模型。并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个子进程来处理。
TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况。不过同时也带来了一个不小的问题——为了响应客户机的请求,服务器要创建子进程来处理。而创建子进程是一种非常消耗资源的操作。
*/
socket();
bind();
listen();
while(1) {
	accept();
	if(fork()==0) {
		while(1) {
			read();
			process();
			write();
		}
		close();
		exit();
	}
	close();
}

/*
并发服务器:多路复用I/O
为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型。
在我们调用select()时进程会一直阻塞直到以下的一种情况发生:1)有文件可以读;2)有文件可以写;3)超时所设置的时间到。
*/
socket();
bind();
listen();
while(1) {
	设置监听读写文件描述符(FD_*);
	调用select();
	如果是listen套接字就绪,说明一个新的连接请求建立 {
		建立连接(accept);
		加入到监听文件描述符中去;
	}
	否则说明是一个已经连接过的描述符 {
		进行操作(read或者write);
	}
}

/* TCP并发服务器模型 I/O多路复用 */  

/* 服务器主进程 */
socket();
bind();
listen();      
pthread_create(); //创建客户端连接线程和业务处理线程

/* 连接处理线程 */
while(1)
{
	accept(); //接受一个客户端连接
	store();//存储客户端套接字描述符到一个公共集合中
}

/* 业务处理线程 */
while(1)
{
	get(); //取出可用的客户端套接字描述符
	select(); //设置监听读写文件描述符集合
	recv();
	process();
	send();
	close();
}

pthread_join(); //等待线程结束
close(); //关闭服务器套接字
参考链接:

Linux网络编程:9. 服务器模型
http://read.pudn.com/downloads128/ebook/546205/Linux%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/09.pdf

Linux网络编程服务器模型选择之循环服务器
http://www.cnblogs.com/lizhenghn/p/3617608.html

Linux网络编程服务器模型选择之IO复用循环并发服务器
http://www.cnblogs.com/lizhenghn/p/3619091.html

常见网络服务器并发编程模型
http://cpper.info/2016/07/30/Concurrency-Network-Server-Models.html

使用事件驱动模型实现高效稳定的网络服务器程序
https://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/

使用异步 I/O 大大提高应用程序的性能
https://www.ibm.com/developerworks/cn/linux/l-async/

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/3501.html

4 thoughts on “Linux网络编程中的几种简单服务器模型”

发表评论

电子邮件地址不会被公开。 必填项已用*标注