- 1、本文档共80页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工程科技]第18章 客户—服务器模型
第18章 客户—服务器模型 第18章 客户—服务器模型 18.1 基本模型 18.1.1 面向连接与无连接 18.1.2 并发和迭代18.2 Winsock I/O模型 18.2.1 I/O复用-select 18.2.2 消息机制--WSAAsyncSelect 18.2.3 事件机制-WSAEventSelect 18.2.4 重叠I/0模型 18.2.5 I/O完成端口—IOCP 18.1 基本模型 在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点: 非对等作用; 通信完全是异步的。 客户机/服务器模式在操作过程中采取的是主动请示方式: 18.1 基本模型 首先服务器方要先启动,并根据请示提供相应服务:1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客户请求5、关闭服务器。 18.1 基本模型 客户方: 1、打开一通信通道,并连接到服务器所在主机的特定端口。 2、向服务器发送服务请求报文,等待并接收应答;继续提出请求…… 3、请求结束后关闭通信通道并终止。 18.1.1 面向连接与无连接 可以是基于连接的TCP协议,要求建立和释放连接,适用于可靠的交互过程; 也可以是无连接的UDP协议,适用于可靠性要求不高的或实时的交互过程; 同时使用TCP和UDP的服务,有两种服务器软件的实现或服务器软件同时和TCP、UDP协议交互,不对客户做限制。 面向连接的套接字的系统调用时序图 无连接协议的套接字调用时序图 18.1.2 并发和迭代 能同时接受多个客户连接的服务器称为并发服务器(concurrent server) 一次只能接受一个客户连接的服务器称为迭代服务器(iterative server) 由于服务器软件要支持多个客户的同时访问,它必须具备并发性。服务器软件为每个新到的客户创建一个进程或线程来处理和这个客户的通信。服务器方传送层实体使用客户的源端口号和服务的端口号来确定正确的服务器软件进程(线程)。 18.2 Winsock I/O模型 常用的Winsock I/O模型有5种: I/O复用—select 消息机制—WSAAsyncSelect 事件机制-WSAEventSelect 重叠I/0模型 I/O完成端口—IOCP 18.2.1 I/O复用—select 简述:确定一个或多个套接口的状态,如需要则等待。#include winsock.hint select( int nfds, fd_set FAR* readfds,fd_set FAR* writefds, fd_set FAR* exceptfds,const struct timeval FAR* timeout);nfds:本参数忽略,仅起到兼容作用。readfds:(可选)指针,指向一组等待可读性检查的套接口。writefds:(可选)指针,指向一组等待可写性检查的套接口。exceptfds:(可选)指针,指向一组等待错误检查的套接口。timeout:select()最多等待时间,对阻塞操作则为NULL。 18.2.1 I/O复用—select 注释:??本函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。用fd_set结构来表示一组等待检查的套接口。在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd_set的操作,这些宏与Berkeley Unix软件中的兼容,但内部的表达是完全不同的。 18.2.1 I/O复用—select readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成。如果虚电路被“优雅地”中止,则recv()不读取数据立即返回;如果虚电路被强制复位,则recv()将以WSAECONNRESET错误立即返回。如果SO_OOBINLINE选项被设置,则将检查带外数据是否存在。 18.2.1 I/O复用—select writefds参数标识等待可写性检查的套接口。如果一个套接口正在connect()连接(非阻塞
文档评论(0)