第18章 客户—服务器模型课件

上传人:我*** 文档编号:140983531 上传时间:2020-08-03 格式:PPT 页数:80 大小:155.50KB
返回 下载 相关 举报
第18章 客户—服务器模型课件_第1页
第1页 / 共80页
第18章 客户—服务器模型课件_第2页
第2页 / 共80页
第18章 客户—服务器模型课件_第3页
第3页 / 共80页
第18章 客户—服务器模型课件_第4页
第4页 / 共80页
第18章 客户—服务器模型课件_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《第18章 客户—服务器模型课件》由会员分享,可在线阅读,更多相关《第18章 客户—服务器模型课件(80页珍藏版)》请在金锄头文库上搜索。

1、第18章 客户服务器模型,第18章 客户服务器模型,18.1 基本模型18.1.1 面向连接与无连接18.1.2 并发和迭代18.2 Winsock I/O模型18.2.1 I/O复用-select18.2.2 消息机制-WSAAsyncSelect18.2.3 事件机制-WSAEventSelect18.2.4 重叠I/0模型18.2.5 I/O完成端口IOCP,18.1 基本模型,在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点: 非对等作用; 通信完全是异步的。 客户机/服务器模式在操作过程中采取的

2、是主动请示方式:,18.1 基本模型,首先服务器方要先启动,并根据请示提供相应服务:1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2、等待客户请求到达该端口。3、接收到重复服务请求,处理该请求并发送应答信号。4、返回第二步,等待另一客户请求5、关闭服务器。,18.1 基本模型,客户方:1、打开一通信通道,并连接到服务器所在主机的特定端口。2、向服务器发送服务请求报文,等待并接收应答;继续提出请求3、请求结束后关闭通信通道并终止。,18.1.1 面向连接与无连接,可以是基于连接的TCP协议,要求建立和释放连接,适用于可靠的交互过程; 也可以是无连接的UDP协议,适用于可

3、靠性要求不高的或实时的交互过程; 同时使用TCP和UDP的服务,有两种服务器软件的实现或服务器软件同时和TCP、UDP协议交互,不对客户做限制。,面向连接的套接字的系统调用时序图,无连接协议的套接字调用时序图,18.1.2 并发和迭代,能同时接受多个客户连接的服务器称为并发服务器(concurrent server) 一次只能接受一个客户连接的服务器称为迭代服务器(iterative server) 由于服务器软件要支持多个客户的同时访问,它必须具备并发性。服务器软件为每个新到的客户创建一个进程或线程来处理和这个客户的通信。服务器方传送层实体使用客户的源端口号和服务的端口号来确定正确的服务器软

4、件进程(线程)。,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 int select( int nfds, fd_set FAR* readfds,fd_set FAR* writefds, fd_set FAR* exceptfds,const struct timeval FAR* timeout);nfds:本参

5、数忽略,仅起到兼容作用。readfds:(可选)指针,指向一组等待可读性检查的套接口。writefds:(可选)指针,指向一组等待可写性检查的套接口。exceptfds:(可选)指针,指向一组等待错误检查的套接口。timeout:select()最多等待时间,对阻塞操作则为NULL。,18.2.1 I/O复用select,注释:本函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。用fd_set结构来表示一组等待检查的套接口。在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。有一组宏可用于对fd

6、_set的操作,这些宏与Berkeley Unix软件中的兼容,但内部的表达是完全不同的。,18.2.1 I/O复用select,readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成。如果虚电路被“优雅地”中止,则recv()不读取数据立即返回;如果虚电路被强制复位,则recv()将以W

7、SAECONNRESET错误立即返回。如果SO_OOBINLINE选项被设置,则将检查带外数据是否存在。,18.2.1 I/O复用select,writefds参数标识等待可写性检查的套接口。如果一个套接口正在connect()连接(非阻塞),可写性意味着连接顺利建立。如果套接口并未处于connect()调用中,可写性意味着send()和sendto()调用将无阻塞完成。但并未指出这个保证在多长时间内有效,特别是在多线程环境中。,18.2.1 I/O复用select,exceptfds参数标识等待带外数据存在性或意味错误条件检查的套接口。请注意如果设置了SO_OOBINLINE选项为假FALS

8、E,则只能用这种方法来检查带外数据的存在与否。对于SO_STREAM类型套接口,远端造成的连接中止和KEEPALIVE错误都将被作为意味出错。如果套接口正在进行连接connect()(非阻塞方式),则连接试图的失败将会表现在exceptfds参数中。,18.2.1 I/O复用select,如果对readfds、writefds或exceptfds中任一个组类不感兴趣,可将它置为空NULL。,18.2.1 I/O复用select,在winsock.h头文件中共定义了四个宏来操作描述字集。FD_SETSIZE变量用于确定一个集合中最多有多少描述字(FD_SETSIZE缺省值为64,可在包含wins

9、ock.h前用#define FD_SETSIZE来改变该值)。对于内部表示,fd_set被表示成一个套接口的队列,最后一个有效元素的后续元素为INVAL_SOCKET。宏为:FD_CLR(s,*set):从集合set中删除描述字s。FD_ISSET(s,*set):若s为集合中一员,非零;否则为零。FD_SET(s,*set):向集合添加描述字s。FD_ZERO(*set):将set初始化为空集NULL。,18.2.1 I/O复用select,timeout参数控制select()完成的时间。若timeout参数为空指针,则select()将一直阻塞到有一个描述字满足条件。否则的话,time

10、out指向一个timeval结构,其中指定了select()调用在返回前等待多长时间。如果timeval为0,0,则select()立即返回,这可用于探询所选套接口的状态。如果处于这种状态,则select()调用可认为是非阻塞的,且一切适用于非阻塞调用的假设都适用于它。举例来说,阻塞钩子函数不应被调用,且WINDOWS套接口实现不应yield。,18.2.1 I/O复用select,返回值: select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数; 如果超时则返回0; 否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应

11、错误代码。,18.2.1 I/O复用select,错误代码:WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。WSAEINVAL:超时时间值非法。WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。WSAENOTSOCK:描述字集合中包含有非套接口的元素。,18.2.2 消息机制-WSAAsyncSelect,简述:通知套接口有请求事件发生. #include

12、 int WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg,long lEvent );s:标识一个需要事件通知的套接口的描述符.hWnd:标识一个在网络事件发生时需要接收消息的窗口句柄.wMsg:在网络事件发生时要接收的消息.lEvent:位屏蔽码,用于指明应用程序感兴趣的网络事件集合.,18.2.2 消息机制-WSAAsyncSelect,注释:本函数用来请求Windows Sockets DLL为窗口句柄发一条消息无论它何时检测到由lEvent参数指明的网络事件.要发送的消息由wMsg参数标明.被通知的套接口由s标识. 本函数

13、自动将套接口设置为非阻塞模式.,18.2.2 消息机制-WSAAsyncSelect,lEvent参数由下表中列出的值组成:,18.2.2 消息机制-WSAAsyncSelect,返回值: 0:若应用程序感兴趣的网络事件的声明成功. SOCKET_ERROR:可通过调用WSAGetLastError()返回特定的错误代码.,18.2.2 消息机制-WSAAsyncSelect,返回的可能网络事件如下 :,网络事件与重新激活函数,18.2.3 事件机制-WSAEventSelect,简述:确定与所提供的FD_XXX网络事件集合相关的一个事件对象。 #include int WSAAPI WSAE

14、ventSelect ( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); s:一个标识套接口的描述字。hEventObject:一个句柄,用于标识与所提供的FD_XXX网络事件集合相关的一个事件对象。lNetworkEvents:一个屏蔽位,用于指定感兴趣的FD_XXX网络事件组合。,18.2.3 事件机制-WSAEventSelect,返回值:如果应用程序指定的网络事件及其相应的事件对象成功设置,则返回0。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。,1

15、8.2.3 事件机制-WSAEventSelect,错误代码:WSANOTINITIALISED:在调用本API之前应成功调用WSAStartup()。WSAENETDOWN: 网络子系统失效。WSAEINVAL:参数中有非法值,或者指定的套接口处于非法状态。WSAEINPROGRESS:一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数WSAENOTSOCK:描述字不是一个套接口。,18.2.3 事件机制-WSAEventSelect,WSAEnumNetworkEvents()函数: 简述:检测所指定套接口上网络事件的发生。 #include int WSAAPI

16、WSAEnumNetworkEvents ( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents,LPINT lpiCount);s:标识套接口的描述字。hEventObject:(可选)句柄,用于标识需要复位的相应事件对象。lpNetworkEvents:一个WSANETWORKEVENTS结构的数组,每一个元素记录了一个网络事件和相应的错误代码。lpiCount:数组中的元素数目。在返回时,本参数表示数组中的实际元素数目;如果返回值是WSAENOBUFS,则表示为获取所有网络事件所需的元素数目。,18.2.3 事件机制-WSAEventSelect,返回值:如果操作成功则返回0。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。 错误代码:WSANOTINITIALISED:在调用本API之前应成功调用WSAStartup()。WSAENETDOWN:网络子系统失效。WSAEINVAL:参数中有非法值。WSAEINPR

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号