ch7_Winsock服务提供者接口(SPI)

上传人:ahu****ng1 文档编号:147905644 上传时间:2020-10-14 格式:PPTX 页数:43 大小:567.68KB
返回 下载 相关 举报
ch7_Winsock服务提供者接口(SPI)_第1页
第1页 / 共43页
ch7_Winsock服务提供者接口(SPI)_第2页
第2页 / 共43页
ch7_Winsock服务提供者接口(SPI)_第3页
第3页 / 共43页
ch7_Winsock服务提供者接口(SPI)_第4页
第4页 / 共43页
ch7_Winsock服务提供者接口(SPI)_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《ch7_Winsock服务提供者接口(SPI)》由会员分享,可在线阅读,更多相关《ch7_Winsock服务提供者接口(SPI)(43页珍藏版)》请在金锄头文库上搜索。

1、第七章,Winsock服务提供者接口(SPI),*,1,内容提要,SPI概述 Winsock协议目录 分层服务提供者(LSP) 基于SPI的数据包过滤实例,*,2,Winsock 2 是围绕着Windows开放系统架构(Windows Open System Architecture,WOSA)来设计的,WOSA在Winsock和Winsock应用程序之间有一个标准API;在Winsock和Winsock服务提供者(比如TCP/IP)之间有一个标准的SPI。,概述,*,3,图7-1 Winsock 2的WOSA架构,*,4,传输服务提供者 传输服务提供者(Transport Service p

2、roviders,一般称作协议栈,比如TCP/IP)即能够提供建立通信、传输数据、日常数据流控制和错误控制等功能的服务。 类型:分层的(Layered),基础的(Base) 基础服务提供者负责实现传输协议的真正细节,导出Winsock接口,此接口直接实现协议。 分层服务提供者将自己安装到Winsock目录中的基础提供者上面,截取来自应用程序的Winsock API调用。,*,5,分层服务提供者仅实现更高层的定制通信函数,它依靠现存的底层基础提供者来与远程终端作实际的数据交换, 分层服务提供者位于基础服务提供者之上,依靠它来实现各种功能。,图8-2 协议层次,*,6,名字空间提供者 把一个网络协

3、议的地址属性和一个或多个用户友好名关联到一起,以便启用与协议无关的名字解析方案。 命名空间提供者在命名空间目录安装自己,当应用程序执行名字解析时将会被调用。,*,7,SPI命名规则:前缀标示 WSP(Winsock提供者):用于传输服务提供者函数。 NSP(名字空间提供者):用于名字空间提供者函数。 WPU(Winsock提供者上调):供服务提供者调用的Ws2_32.dll支持函数(分层服务提供者使用的支持函数。) WSC(Winsock配置):供在Winsock 2中安装服务提供者的函数使用。,*,8,Winsock协议目录,SPI提供3种协议:分层协议、基础协议、协议链 基础协议是能够独立

4、、安全地和远程端点实现数据通信的协议。 分层协议在基础协议的上层,依靠底层基础协议实现更高层的通信服务。 协议链是将一系列的基础协议和分层协议按特定的顺序连接在一起的链状结构。,*,9,协议信息 系统安装了哪些协议以及这些协议的特性,通常为协议信息。 如果一个协议支持多种行为,每类行为在系统中都有各自的目录条目。例如,如果系统中安装了TCP/IP,系统中就会有两个IP条目:TCP和UDP。 Winsock采用WSAPROTOCOL_INFO结构描述特定协议的完整信息。具体定义如下:,*,10,WSAPROTOCOL_INFO结构定义如下: typedef struct WSAPROTOCOL_

5、INFO DWORD dwServiceFlags1; DWORD dwServiceFlags2; DWORD dwServiceFlags3; DWORD dwServiceFlags4; DWORD dwProviderFlags; GUID ProviderId;/服务提供者厂商安排的GUID DWORD dwCatalogEntryId;/为该结构体安排的唯一标示符(目录入口) WSAPROTOCOLCHAIN ProtocolChain;/协议链结构体 int iVersion; int iAddressFamily;/地址家族 int iMaxSockAddr; int iMin

6、SockAddr; int iSocketType;/套接字类型 int iProtocol;/协议 int iNetworkByteOrder; int iSecurityScheme; DWORD dwMessageSize; DWORD dwProviderReserved; CHAR szProtocolWSAPROTOCOL_LEN+1; WSAPROTOCOL_INFO,*LPWSAPROTOCOL_INFO;,*,11,获取协议信息 使用Winsock API函数WSAEnumProtocols(); 使用Winsock SPI函数WSCEnumProtocols();,*,12

7、,int WSAEnumProtocols( LPINT lpiProtocols,/整型数组,指定要枚举的协议,可选。指定为NULL则返回所有的协议。 LPWSAPROTOCOL_INFO lpProtocolBuffer,/存放协议信息的缓冲区 LPDWORD lpdwBufferLength/缓冲区长度 ); 枚举指定的网络协议信息,将具体的协议信息填充到WSAPROTOCOL_INFO结构体中。 WSAEnumProtocols函数仅能枚举基础协议和协议链,不能枚举分层协议。 返回值:成功为协议个数,失败为SOCKET_ERROR 。 注:创建套接字时使用WSAEnumProtocol

8、s函数枚举系统中安装的协议,根据传递的参数找到一个与之匹配的协议,然后调用此协议的提供者导出的函数来完成各种Winsock调用。,*,13,WSAEnumProtocols函数的使用方法: 首先以lpProtocolBuffer为NULL,lpdwBufferLength为0调用WSAEnumProtocols ,该调用会以WSAENBUFS失败,此时lpdwBufferLength参数包含了所需的缓冲区长度。 以lpdwBufferLength包含的缓冲区长度分配内存空间 再次以分配的内存空间调用WSAEnumProtocols 实例,*,14,WSCEnumPtotocols( LPINT

9、 lpiProtocols, LPWSAPROTOCOL_INFOW lpProtocolBuffer, LPDWORD lpdwBufferLength, LPINT lpErrno/取得调用出错后的出错代码 ); 该函数能够枚举各种协议,包括分层协议、基础协议和协议链。 协议信息存放在WSAPROTOCOL_INFOW结构体中,支持UNICODE。 使用方法同WSAEnumProtocols 实例,*,15,typedef struct _WSAPROTOCOL_INFOW DWORD dwServiceFlags1; DWORD dwServiceFlags2; DWORD dwServ

10、iceFlags3; DWORD dwServiceFlags4; DWORD dwProviderFlags; GUID ProviderId; DWORD dwCatalogEntryId; WSAPROTOCOLCHAIN ProtocolChain; int iVersion; int iAddressFamily; int iMaxSockAddr; int iMinSockAddr; int iSocketType; int iProtocol; int iProtocolMaxOffset; int iNetworkByteOrder; int iSecurityScheme;

11、DWORD dwMessageSize; DWORD dwProviderReserved; WCHAR szProtocolWSAPROTOCOL_LEN+1;/UNICODE字符串 WSAPROTOCOL_INFOW, *LPWSAPROTOCOL_INFOW;,*,16,分层服务提供者(LSP),分层提供者的体系结构,图7-2分层提供者的体系结构,*,17,WS2_32.dll加载下层服务提供者,利用下层服务提供者导出的函数实现其内部API函数。 被WS2_32加载的下层服务提供者,由调用基础服务提供者(或者其下层服务提供者)提供的服务实现其内部SPI函数。 用户创建套接字时, 套接字创

12、建函数(如socket)在Winsock目录寻找合适的协议; 此协议的提供者导出的函数完成各种功能 编写分层服务提供者并安装可以截获Winsock调用,*,18,运行原理,安装LSP 安装LSP实质就是安装一个WSAPROTOCOL_INFOW结构,该结构定义了分层提供者的特性和LSP是如何填写链的。 安装LSP后在Winsock目录中就有了一个WSAPROTOCOL_INFOW结构,让创建套接字的应用程序可以枚举到它。,*,19,协议链 协议链描述了分层提供者加入Winsock目录的顺序,也就是在协议链中的位置。 协议链由嵌入在WSAPROTOCOL_INFOW结构中的WSAPROTOCOL

13、CHAIN结构中的数据指定,结构定义如下: typedef struct _WSAPROTOCOLCHAIN int ChainLen; /0表示分层协议,1表示基础协议, /1表示协议链 DWORD ChainEntriesMAX_PROTOCOL_CHAIN; /目录ID数组 WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;,*,20,当ChianLen是0或1时,包含在ChianEntries数组中的数据是无意义的。 当ChianLen大于1时,形成协议链的各个服务提供者的目录ID都包含在ChianEntries数组中。 LSP在协议链中位置的影响:

14、 顶层:被Ws2_32.dll加载 非顶层:被链中位于它上层的LSP加载 LSP被加载后的动作: 1) 首先调用LSP导出的函数WSPStartup() 2) 将包含协议链的WSAPROTOCOL_INFOW结构传递给这个函数 3) LSP再找到协议链中位于自己下方的提供者,进而加载它,*,21,安装LSP时,必须在Winsock目录中安装两种协议:分层协议、协议链 安装分层协议是为了获取Winsock目录分配的目录ID,以便在协议链中标识自己。 协议链是Winsock目录中LSP的真正入口,链中包含了自己分层协议的目录ID号和下层提供者的目录ID号,这些目录ID构成ChainEntries,

15、进而构建一个WSAPROTOCOL_INFOW结构 安装函数 需要为该函数提供LSP的GUID、DLL位置、描述LSP支持协议的一个或多个WSAPROTOCOL_INFOW结构。,*,22,函数定义 int WSCInstallProvider( const LPGUID lpProviderId, / 要安装的提供者的GUID const LPWSTR lpszProviderDllPath, / 指定提供者DLL路径 const LPWSAPROTOCOL_INFO lpProtocolInfoList, / 指向一个WSAPROTOCOL_INFOW结构数组 DWORD dwNumber

16、OfEntries, / lpProtocolInfoList数组中条目数量,即数组大小 LPINT lpErrno / 返回可能的失败代码 );/ 只有UNICODE版本,失败则返回SOCKET_ERROR,*,23,lpProviderId: GUID可以通过命令行工具UUIDGEN或者编程中使用UuidCreate函数生成。 lpszProviderDllPath: UNICODE字符串,包含环境变量。如 %SYSTEMROOT% lpProtocolInfoList: WSAPROTOCOL_INFOW结构的数组,每个数组成员是一个要安装的单独目录,即可一次安装多个服务提供者 通常从它要分层的下层提供者拷贝,两种情况例外: 第一,szProtocol域要修改,以包含新提供者的名称 第二,如有XP1_IFS_HANDLES标志,从dwServiceFlags1域中移除XP1_IFS_HANDLES标志,该标志表示此提供者返回的句柄是真正地操作系统句柄,在该句柄上会引起user/kernel模式的转换

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

当前位置:首页 > 商业/管理/HR > 管理学资料

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