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


=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=


《 “Linux网络编程中的几种简单服务器模型” 》 有 5 条评论

  1. 网络 IO 演变发展过程和模型介绍
    https://mp.weixin.qq.com/s/EDzFOo3gcivOe_RgipkTkQ
    `
    1.1 网络 IO 的各个发展阶段

    通常,我们在此讨论的网络 IO 一般都是针对 linux 操作系统而言。网络 IO 的发展过程是随着 linux 的内核演变而变化,因此网络 IO 大致可以分为如下几个阶段:
    1. 阻塞 IO(BIO)
    2. 非阻塞 IO(NIO)
    3. IO 多路复用第一版(select/poll)
    4. IO 多路复用第二版(epoll)
    5. 异步 IO(AIO)
    而每一个阶段,都是因为当前的网络有一些缺陷,因此又在不断改进该缺陷。这是网络 IO 一直演变过程中的本质。下面将对上述几个阶段进行介绍,并对每个阶段的网络 IO 解决了哪些问题、优点、缺点进行剖析。
    `

    IO 模式和 IO 多路复用
    https://juejin.im/post/5bf7b89e518825369c564059

    Linux IO 模式及 select、poll、epoll 详解
    https://segmentfault.com/a/1190000003063859

    Chapter 6. I/O Multiplexing: The select and poll Functions
    http://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06.html

    高性能 IO 模型分析-Reactor 模式和 Proactor 模式(二)
    https://zhuanlan.zhihu.com/p/95662364

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注