《Linux环境下C编程指南(第二版)》p251
客户段/服务器模式章节中,讲解了客户段和服务器的设计,在此Mark一下
------------------------------------
客户端的设计需要考虑以下因素:
1,大多数客户软件在与多个服务器进行交互时,不必明显地处理并发
2,大多数客户软件像常规应用软件那样运行,因为它一般不会访问特权协议端口,所以不要求一定的特权
3,大多数客户软件不需要强行保护,它可以依赖操作系统自动地强行执行保护
客户端根据连接性分为两种:TCP客户端,UDP客户端
======
TCP客户端算法
使用TCP处理全部的可靠性和流量控制问题
1,找到希望与之通信的服务器的IP地址和协议端口号
2,创建一个套接字
3,指明此连接需要一个在本地机器中任意的未使用的协议端口号
4,与服务器建立连接
5,使用应用级协议与服务器通信(请求和应答)
6,关闭连接
======
UDP客户端算法
1,找到希望与之通信的服务器的IP地址和协议端口号
2,创建一个套接字
3,指明此连接需要一个在本地机器中任意的未使用的协议端口号
4,指明数据包要发往的服务器
5,使用应用级协议与服务器通信(请求和应答)
6,关闭连接
------------------------------------
服务器的设计
最简单的服务器算法是:创建一个套接字,并将它绑定到一个端口上,然后执行一个无线迭代,在迭代中,服务器接收来自客户的下一个请求,处理这个请求,构造一个应答,并发回给客户。
服务器的分类:
1,根据服务器在同一时刻处理请求的个数将服务器分为并发服务器(concurrent server)和迭代服务器(iterator server)
======
迭代服务器在同一时刻只处理一个客户请求
======
并发服务器在同一个时刻可以处理多个客户请求
大多数的并发服务器使用多进程来达到并发性,它们可以划分为主进程和从进程两类。一个主服务器进程最先开始执行,它在服务器的端口上打开一个套接字,等待下一个请求,并为处理的每个请求创建一个从服务器进程,由一个从进程处理一个客户的通信。在从进程构成一个响应并将它发给客户后,从进程退出。
======
无连接并发服务器的算法
1)主1:创建一个UDP套接字并将其绑定到提供服务的服务器端口上
2)主2:重复调用recvfrom接收来自客户的下一个请求,创建一个新的从进程来处理响应
3)从1:由于收到一个特定的请求以及访问到该套接字而被创建
4)从2:根据应用协议构造一个应答,并用sendto将应答发回给客户
5)从3:从进程在处理完一个请求后终止
======
面向连接并发服务器的算法
1)主1:创建一个TCP套接字,并将其绑定到提供服务的服务器端口上
2)主2:将该套接字设置为被动模式(调用listen),作为服务器使用
3)主3:重复调用accept接收来自客户的下一个请求,并创建一个新的从进程来处理相应
4)从1:由于接收一个连接请求而被创建
5)从2:用该连接与客户进行交互,读取请求并发回响应
6)从3:关闭连接并退出,在处理完来自一个客户的所有请求后,从进程就退出。
注意:面向连接服务器很少采用并发实现,因为创建创建进程耗费的资源比较多,更多的是使用多线程来实现
2,根据连接性分为面向连接的服务器和无连接的服务器
======
面向连接的服务器算法
在面向连接的服务器的方式实现中,TCP传输协议自动处理分组丢失和交付失序的问题,而服务器只要管理和使用这些连接就可以
1)服务器接收来自某个客户的连接
2)通过这个连接发送所有的通信数据
3)从客户端接受请求并作出应答
4)服务器在完成交互后关闭
注意:面向连接的设计要求对每个连接都有一个单独的套接字,而无连接的设计则允许一个套接口上与多个主机通信。采用面向连接的设计时,在资源使用上,服务器拥有分配给该连接的数据结构(包括缓冲区空间)的权利,并且这些资源不能被重复分配(因为服务器必须设计成始终运行),所以如果不断有客户端崩溃,服务器就可能因为耗尽资源而终止运行。
======
无连接的服务器的算法
无连接的服务器没有资源耗尽的困扰,但是它不能依靠下层传输提供可靠的传递,这样通信的一方或者双方就必须要担当可靠交付的责任。如果用户发送一个数据包,它可能到达,也可能中间丢失,更有传到时发生次序颠倒的可能,不过如果它到达了,包的内部是无错误的。
客户段/服务器模式章节中,讲解了客户段和服务器的设计,在此Mark一下
------------------------------------
客户端的设计需要考虑以下因素:
1,大多数客户软件在与多个服务器进行交互时,不必明显地处理并发
2,大多数客户软件像常规应用软件那样运行,因为它一般不会访问特权协议端口,所以不要求一定的特权
3,大多数客户软件不需要强行保护,它可以依赖操作系统自动地强行执行保护
客户端根据连接性分为两种:TCP客户端,UDP客户端
======
TCP客户端算法
使用TCP处理全部的可靠性和流量控制问题
1,找到希望与之通信的服务器的IP地址和协议端口号
2,创建一个套接字
3,指明此连接需要一个在本地机器中任意的未使用的协议端口号
4,与服务器建立连接
5,使用应用级协议与服务器通信(请求和应答)
6,关闭连接
======
UDP客户端算法
1,找到希望与之通信的服务器的IP地址和协议端口号
2,创建一个套接字
3,指明此连接需要一个在本地机器中任意的未使用的协议端口号
4,指明数据包要发往的服务器
5,使用应用级协议与服务器通信(请求和应答)
6,关闭连接
------------------------------------
服务器的设计
最简单的服务器算法是:创建一个套接字,并将它绑定到一个端口上,然后执行一个无线迭代,在迭代中,服务器接收来自客户的下一个请求,处理这个请求,构造一个应答,并发回给客户。
服务器的分类:
1,根据服务器在同一时刻处理请求的个数将服务器分为并发服务器(concurrent server)和迭代服务器(iterator server)
======
迭代服务器在同一时刻只处理一个客户请求
======
并发服务器在同一个时刻可以处理多个客户请求
大多数的并发服务器使用多进程来达到并发性,它们可以划分为主进程和从进程两类。一个主服务器进程最先开始执行,它在服务器的端口上打开一个套接字,等待下一个请求,并为处理的每个请求创建一个从服务器进程,由一个从进程处理一个客户的通信。在从进程构成一个响应并将它发给客户后,从进程退出。
======
无连接并发服务器的算法
1)主1:创建一个UDP套接字并将其绑定到提供服务的服务器端口上
2)主2:重复调用recvfrom接收来自客户的下一个请求,创建一个新的从进程来处理响应
3)从1:由于收到一个特定的请求以及访问到该套接字而被创建
4)从2:根据应用协议构造一个应答,并用sendto将应答发回给客户
5)从3:从进程在处理完一个请求后终止
======
面向连接并发服务器的算法
1)主1:创建一个TCP套接字,并将其绑定到提供服务的服务器端口上
2)主2:将该套接字设置为被动模式(调用listen),作为服务器使用
3)主3:重复调用accept接收来自客户的下一个请求,并创建一个新的从进程来处理相应
4)从1:由于接收一个连接请求而被创建
5)从2:用该连接与客户进行交互,读取请求并发回响应
6)从3:关闭连接并退出,在处理完来自一个客户的所有请求后,从进程就退出。
注意:面向连接服务器很少采用并发实现,因为创建创建进程耗费的资源比较多,更多的是使用多线程来实现
2,根据连接性分为面向连接的服务器和无连接的服务器
======
面向连接的服务器算法
在面向连接的服务器的方式实现中,TCP传输协议自动处理分组丢失和交付失序的问题,而服务器只要管理和使用这些连接就可以
1)服务器接收来自某个客户的连接
2)通过这个连接发送所有的通信数据
3)从客户端接受请求并作出应答
4)服务器在完成交互后关闭
注意:面向连接的设计要求对每个连接都有一个单独的套接字,而无连接的设计则允许一个套接口上与多个主机通信。采用面向连接的设计时,在资源使用上,服务器拥有分配给该连接的数据结构(包括缓冲区空间)的权利,并且这些资源不能被重复分配(因为服务器必须设计成始终运行),所以如果不断有客户端崩溃,服务器就可能因为耗尽资源而终止运行。
======
无连接的服务器的算法
无连接的服务器没有资源耗尽的困扰,但是它不能依靠下层传输提供可靠的传递,这样通信的一方或者双方就必须要担当可靠交付的责任。如果用户发送一个数据包,它可能到达,也可能中间丢失,更有传到时发生次序颠倒的可能,不过如果它到达了,包的内部是无错误的。