标签:
synapse (http://synapse.ararat.cz/doku.php)的源码简洁明了,属于轻量级的阻塞式socket通讯组件包,更多的功能需要自己基于它的基础上去封装实现。相对于indy(阻塞)和ics(非阻塞/阻塞)来说,我更喜欢synapse的原生和纯粹,因此对其进行了简单的学习和总结。
在着手学习synapse之前,有必要先对常见的服务器模型做下回顾,这对接下来解读synapse代码非常有帮助。
在目前的网络应用中,大多数是一个服务端对应多个客户端的联网方式,那么我就着重分析一下这种情景下服务器模型:
TCP循环服务器一次只能处理一个客户端的请求,只有在这个客户的所有请求满足后,服务器才可以继续后面的请求。如果有一个客户端占住服务器不放时,其它的客户机都不能工作了,因此,TCP服务器一般很少用循环服务器模型的。
其模型为:
1
2
3
4
5
6
7
8
9
|
socket(...); bind(...); listen(...); while (1) { accept(...); process(...); close(...); } |
TCP并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。
其模型为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
socket(...); bind(...); listen(...); while (1) { accpet(...); if (fork(...) == 0) { process(...); close(...); exit (...); } close(...); } |
UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将结果返回给客户机,因为UDP是非面向连接的,没有一个客户端可以老是占住服务端。只要处理过程不是死循环,服务器对于每一个客户机的请求总是能够满足。
其模型为:
1
2
3
4
5
6
7
8
|
socket(...); bind(...); while (1) { recvfrom(...); process(...); sendto(...); } |
人们把并发的概念用于UDP就得到了并发UDP服务器模型. 并发UDP服务器模型其实是简单的.和并发的TCP服务器模型一样是创建一个子进程来处理的 算法和并发的TCP模型一样,除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种模型。
其模型为:
1
2
3
4
5
6
7
8
9
10
11
|
socket(...); //创建一个数据报类型的套接字 bind(...); //绑定公认的短口号 while (1) //开始接收客户端的连接 { recvfrom(...); //接收和处理客户端的UDP数据报 if (fork(...)==0) //创建子进程 { process(...); sendto(...); } } |
转载请注明:梧桐树下 » synapse socket总结一:服务器模型
http://www.pfeng.org/archives/449
标签:
原文地址:http://www.cnblogs.com/findumars/p/5111803.html