网络编程之Winsock2 服务提供者接口(SPI)


【1】Winsock2 服务提供者接口(SPI):


一、简述:


1、一般用于提供给操作系统开发商传输堆栈商在基础协议的基础上,开发更高级的服务.

2、因为Winsock服务体系符合Windows开放服务体系.所以,它支持第三方服务提供者插入到其中.

3、只要上层和下层的边缘支持Winsock2 SPI,即可向他们中间安装第三方提供者程序.

4、普通开发者一般都是开发SPI的LSP(分层服务提供者),即第三方提供者,可用于监控Winsock API执行,HOOK Winsock API,甚至利用LSP技术注入DLL.

5、基础协议(TCP、UDP、原始)的提供者其实就是DLL,编写分层协议提供者就是在编写DLL,然后安装在Winsock目录上,让系统上的所有使用基础协议的网络程序调用.


重点】网络程序是如何调用Winsock2 服务提供者进行网络通讯:


1、当网络程序使用WSAStartup加载库时,系统并不做什么.

2、而是当程序真正创建套接字时,会先调用WSCEnumProtocols函数,遍历系统内安装的所有提供者(分层、基础、协议链),先找到一个与要求使用的协议符合的,那么导出此提供者的DLL,才开始调用提供者的WSPStartup初始化函数,才能使用send,recv(TCP协议提供者的DLL)或sendto,recvfrom(UDP协议提供者的DLL)等函数的功能.


二、SPI(服务提供者接口)由两个部分组成:


  一、传输服务提供者:


1、提供建立连接、传输数据、流控制、出错控制。

2、共两种类型:

基础服务提供者:

实现传输协议的细节,导出Winsock接口(此接口直接实现协议). //TCP、UDP、原始

一般都有与之关联的内核模式协议驱动,TCP、UDP由系统内的Tcpip.sys驱动。


分层服务提供者(LSP):

将自己安装到Winsock目录(Winsock目录的概念在下面)中基础提供者(TCP/UDP)的上一层,也可能安装在其他提供者之间,可截获程序的Winsock API。

依靠基础服务提供者作为通信基础,实现更高层的通信函数。


二、命名空间服务提供者:


1、与传输服务提供者相似,可截获名称解析API(gethostbyname、WSALookupServiceBegin)的调用.

2、此类提供者需在命名空间目录安装自己.


【2】SPI(服务提供者)函数集合类型: 

    

 头文件:ws2spi.h

SPI函数类型总数:4种类型,每一种类型都有自己所属的开头,例如WSC、WSP

WSC安装、移除、修改分层服务提供者命名空间提供者程序
WSP分层服务提供者的API
WPU分层服务提供者使用的支持函数
NSP命名空间服务提供者的API

【3】Winsock协议目录的概念:



一、SPI提供三种协议:


1、分层协议:处在基础协议的上一层,依靠基础协议作为通信基础。

2、基础协议:能够独立、安全、远程端点实现数据通信的协议。

3、协议链:将一系列基础协议分层协议按特定顺序连接在一起。


注意:只有管理员用户组能够安装、移除Winsock目录入口!



二、WSAPROTOCOL_INFO结构体:


说明:描述某个协议(分层协议、基础协议)的完整信息,一个WSAPROTOCOL_INFO结构体称为一个Winsock目录入口


 
 
  1. typedef struct _WSAPROTOCOL_INFOW {
  2. DWORD dwServiceFlags1; //描述[协议]提供的服务的位掩码
  3. DWORD dwServiceFlags2; //保留
  4. DWORD dwServiceFlags3; //保留
  5. DWORD dwServiceFlags4; //保留
  6. DWORD dwProviderFlags; //此[协议]在[Winsock目录]中的[表示方式]
  7. GUID ProviderId; //由[服务提供商]安排的GUID唯一标示符
  8. DWORD dwCatalogEntryId; //WS2_32.DLL为每一个WSAPROTOCOL_INFOW结构安排的唯一标示符(目录入口ID)
  9. WSAPROTOCOLCHAIN ProtocolChain; /*1)与[此协议]相关联的WSAPROTOCOLCHAIN结构.
  10. 2)说明了[此协议]在[分层协议]中所处的位置.*/
  11. int iVersion; //[协议]版本标示符
  12. int iAddressFamily; //传递给socket/WSASocket函数的[地址加载参数]
  13. int iMaxSockAddr; //地址的最大长度(以字节为单位)
  14. int iMinSockAddr; //地址的最小长度(以字节为单位)
  15. int iSocketType; //传递给socket函数的[套接字类型参数]
  16. int iProtocol; //传递给socket函数的[协议参数]
  17. int iProtocolMaxOffset; //添加到iProtocol的最大值
  18. int iNetworkByteOrder; //顺序类型:大尾顺序(BIGENDIAN),小尾顺序(LITTLEENDIAN)
  19. int iSecurityScheme; //安全方案
  20. DWORD dwMessageSize; /*[此协议]支持的最大消息长度(以字节为单位)
  21. 1)0为基于流协议(如TCP),没有最大长度的概念.
  22. 2)1为发送消息的最大长度依赖于下层网络的MTU(最大传输单元),在套接字绑定后,应使用SO_MAX_MSG_SIZE套接字选项.
  23. 获取发送消息的最大长度.
  24. 3)-1为此协议是基于消息的,但是对发送的消息没有最大长度的限制.
  25. */
  26. DWORD dwProviderReserved; //保留给服务提供者使用.
  27. WCHAR szProtocol[WSAPROTOCOL_LEN+ 1]; //随意编辑的,此协议的可读字符串.一般用于说明是什么协议
  28. } WSAPROTOCOL_INFOW, FAR * LPWSAPROTOCOL_INFOW;


【4】遍历系统所有已安装的协议:


一、使用的API函数:int WSAEnumProtocols(
  LPINT                                 lpiProtocols,     
  LPWSAPROTOCOL_INFO lpProtocolBuffer,  
  LPDWORD                          lpdwBufferLength
);

返回值:系统中安装的协议数量,失败为SOCKET_ERROR.

参数1:一个数组
1、NULL为函数将返回所有协议.
2、否则只检索数组中列出的那些协议.

参数2:取信息的缓冲区

参数3:参数2缓冲区的长度

1、如果参数2为NULL,参数3为0,执行后,WSAENOBUFS错误,参数3包含了所需的缓冲区长度.


注意:此函数仅能够遍历基础协议、协议链,但是不能遍历分层协议.


二、支持遍历分层协议的函数,功能与上面相同:


函数:intWSCEnumProtocols(
  LPINT lpiProtocols,
  LPWSAPROTOCOL_INFOW lpProtocolBuffer,
  LPDWORD lpdwBufferLength,
  LPINT lpErrno 
);

返回值、参数1~参数3:与WSAEnumProtocols函数相同。

参数4:相当于WSAGetLastError()执行的结果


注意:因为SPI是用于开发系统组件的函数,所以他只使用Unicode字符串,与Windows系统相对应。


【5】遍历系统内安装的所有协议例子:

头文件:


 
 
  1. #pragma once
  2. #include <iostream>
  3. #include <winsock2.h>
  4. #include <ws2tcpip.h>
  5. #include <mstcpip.h>
  6. #include <string.h>
  7. #include <tchar.h>
  8. using namespace std;
  9. #pragma warning(disable:4996)
  10. #pragma comment(lib, "Ws2_32.lib")
  11. //系统安装协议遍历实验
  12. class ProtocolTraversestheExperiment
  13. {
  14. public:
  15. ProtocolTraversestheExperiment()
  16. {
  17. WSADATA wsa;
  18. WSAStartup(MAKEWORD( 2, 2), &wsa);
  19. }
  20. ~ProtocolTraversestheExperiment()
  21. {
  22. WSACleanup();
  23. }
  24. LPWSAPROTOCOL_INFO GetProvider(LPINT lpnTotalProtocols)
  25. {
  26. DWORD dwSize = 0;
  27. LPWSAPROTOCOL_INFO pProtoInfo = NULL;
  28. if (WSAEnumProtocols( NULL, pProtoInfo, &dwSize) == SOCKET_ERROR)
  29. {
  30. if (WSAGetLastError() != WSAENOBUFS)
  31. return NULL;
  32. }
  33. pProtoInfo = (LPWSAPROTOCOL_INFO) new WSAPROTOCOL_INFO[dwSize / sizeof(WSAPROTOCOL_INFO)];
  34. if (!pProtoInfo)
  35. return NULL;
  36. ZeroMemory(pProtoInfo, dwSize);
  37. *lpnTotalProtocols = WSAEnumProtocols( NULL, pProtoInfo, &dwSize);
  38. return pProtoInfo;
  39. }
  40. void FreeProvider(LPWSAPROTOCOL_INFO pProtoInfo,int i)
  41. {
  42. if(i == 1)
  43. delete pProtoInfo;
  44. else
  45. delete[] pProtoInfo;
  46. }
  47. };

源文件:


 
 
  1. #include "Hello.h"
  2. int main(int argc,char** argv)
  3. {
  4. system( "color 4e");
  5. ProtocolTraversestheExperiment s;
  6. int ProtocolsCount = 0;
  7. LPWSAPROTOCOL_INFO info = s.GetProvider(&ProtocolsCount);
  8. if (ProtocolsCount != 0)
  9. {
  10. for ( int i = 0; i < ProtocolsCount; i++)
  11. {
  12. wprintf(_T( "Protocol:%s \r\n"), info[i].szProtocol);
  13. wprintf(_T( "CatalogEntryId:%d ChainLen:%d \n\n"), info[i].dwCatalogEntryId, info[i].ProtocolChain.ChainLen);
  14. }
  15. s.FreeProvider(info, ProtocolsCount);
  16. }
  17. getchar();
  18. return 0;
  19. }

执行:



下一篇文章讲解安装LSP(分层服务提供者): //SPI的使用

1、由于基础传输提供者和命名空间提供者一般仅对操作系统开发商、传输堆栈商有效

      一般开发者只能开发分层服务提供者(所谓的第三方系统组件)

2、黑客通常安装LSP,拦截Winsock API,对用户进行浏览器劫持、监控使用者信息等等.

3、地址:http://blog.csdn.net/aaron133/article/details/78028942

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧农业是一种结合了现代信息技术,包括物联网、大数据、云计算等,对农业生产过程进行智能化管理和监控的新模式。它通过各种传感器和设备采集农业生产中的关键数据,如大气、土壤和水质参数,以及生物生长状态等,实现远程诊断和精准调控。智慧农业的核心价值在于提高农业生产效率,保障食品安全,实现资源的可持续利用,并为农业产业的转型升级提供支持。 智慧农业的实现依赖于多个子系统,包括但不限于设施蔬菜精细化种植管理系统、农业技术资料库、数据采集系统、防伪防串货系统、食品安全与质量追溯系统、应急追溯系统、灾情疫情防控系统、农业工作管理系统、远程诊断系统、监控中心、环境监测系统、智能环境控制系统等。这些系统共同构成了一个综合的信息管理和服务平台,使得农业生产者能够基于数据做出更加科学的决策。 数据采集是智慧农业的基础。通过手工录入、传感器自动采集、移动端录入、条码/RFID扫描录入、拍照录入以及GPS和遥感技术等多种方式,智慧农业系统能够全面收集农业生产过程中的各种数据。这些数据不仅包括环境参数,还涵盖了生长状态、加工保存、检验检疫等环节,为农业生产提供了全面的数据支持。 智慧农业的应用前景广阔,它不仅能够提升农业生产的管理水平,还能够通过各种应用系统,如库房管理、无公害监控、物资管理、成本控制等,为农业生产者提供全面的服务。此外,智慧农业还能够支持政府监管,通过发病报告、投入品报告、死亡报告等,加强农业产品的安全管理和质量控制。 面对智慧农业的建设和发展,存在一些挑战,如投资成本高、生产过程标准化难度大、数据采集和监测的技术难题等。为了克服这些挑战,需要政府、企业和相关机构的共同努力,通过政策支持、技术创新和教育培训等手段,推动智慧农业的健康发展。智慧农业的建设需要明确建设目的,选择合适的系统模块,并制定合理的设备布署方案,以实现农业生产的智能化、精准化和高效化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值