SPI提供3种协议:

1 分层协议
    在基础协议的上层,依靠底层基础协议实现更高级的通信服务。

2 基础协议
    能够独立安全地,和远程断电实现数据通信的协议,相对于分层协议而言的

3 协议连
    将一系列的基础协议,分层协议按特定的顺序连接在一起的链状结构。

协议特性:
  winsock用WSAPROTOCOL_INFO结构描述特定协议的完整信息。称为一个winsock目录入口。

两个重要标识:

ProviderId:服务开发商提供的全局唯一标识

dwCatalogEntryId为每个WSAPROTOCOL_INFO结构安排的唯一标识,称为目录入口ID。

使用winsockapi函数枚举协议

使用WSAEnumProtocols仅能枚举基础协议和协议链,不能枚举分层协议

#include "..\common\initsock.h"#include <windows.h>#include <stdio.h>LPWSAPROTOCOL_INFO GetProvider(LPINT lpnTotalProtocols)
{DWORD dwSize = 0;LPWSAPROTOCOL_INFO pProtoInfo = NULL;if(::WSAEnumProtocols(NULL,pProtoInfo,&dwSize) == SOCKET_ERROR){if(::WSAGetLastError() != WSAENOBUFS)return NULL;}pProtoInfo = (LPWSAPROTOCOL_INFO)::GlobalAlloc(GPTR,dwSize);*lpnTotalProtocols = ::WSAEnumProtocols(NULL,pProtoInfo,&dwSize);return pProtoInfo;
}
void FreeProvider(LPWSAPROTOCOL_INFO    pProtoInfo)
{::GlobalFree(pProtoInfo);
}
CInitSock theSock;
void main()
{int nTotalProtocols;LPWSAPROTOCOL_INFO pProtoInfo = GetProvider(&nTotalProtocols);if(pProtoInfo != NULL){for(int i=0;i<nTotalProtocols;i++){printf("Protocol:%s\n",pProtoInfo[i].szProtocol);printf("CatalogEntryId:%d    ChainLen:%d\n\n",pProtoInfo[i].dwCatalogEntryId,pProtoInfo[i].ProtocolChain.ChainLen);}FreeProvider(pProtoInfo);}
}


使用winsock SPI函数枚举协议

winsock SPI提供的枚举协议的函数是WSCEnumProtocols,能够枚举各种协议,包括分层协议,基础协议,协议链。

与WSAEnumProtocols相比,只多了一个 lpError的参数

下面是WSCEnumProtocols代码:

///
// WSCEnumProtocols.cpp文件#include <Ws2spi.h>        //  SPI函数定义在Ws2spi.h文件中
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32")    // 链接到WS2_32.libLPWSAPROTOCOL_INFOW GetProvider(LPINT lpnTotalProtocols)
{int nError;DWORD dwSize = 0;LPWSAPROTOCOL_INFOW pProtoInfo = NULL;//  取得需要的缓冲区长度if(::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError) == SOCKET_ERROR){if(nError != WSAENOBUFS)return NULL;}// 申请缓冲区,再次调用WSCEnumProtocols函数pProtoInfo = (LPWSAPROTOCOL_INFOW)::GlobalAlloc(GPTR, dwSize);*lpnTotalProtocols = ::WSCEnumProtocols(NULL, pProtoInfo, &dwSize, &nError);return pProtoInfo;
}void FreeProvider(LPWSAPROTOCOL_INFOW pProtoInfo)
{::GlobalFree(pProtoInfo);
}void main()
{LPWSAPROTOCOL_INFOW pProtoInfo;int nProtocols;pProtoInfo = GetProvider(&nProtocols);for(int i=0; i<nProtocols; i++){printf(" Protocol: %ws \n", pProtoInfo[i].szProtocol);printf(" CatalogEntryId: %d        ChainLen: %d \n\n", pProtoInfo[i].dwCatalogEntryId, pProtoInfo[i].ProtocolChain.ChainLen);}
}


Winsock协议目录相关推荐

  1. lr中winsock协议的脚本(转载51testing)

    winsock协议代码 Actions() { char acTest[100]; char acTest2[100]; char* pcTest3; //生成发送的串 sprintf(acTest, ...

  2. java ldap 工具_通过定义LdapUtil工具类实现JAVA关于LDAP协议目录数据保存和删除等操作代码示例...

    一.前言 关于基于jdk开发包javax.naming.directory.DirContext.javax.naming.directory.InitialDirContext目录协议定义LdapU ...

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

    [1]Winsock2 服务提供者接口(SPI): 一.简述: 1.一般用于提供给操作系统开发商.传输堆栈商在基础协议的基础上,开发更高级的服务. 2.因为Winsock服务体系符合Windows开放 ...

  4. 一种解决 【Jupyter Notebook 由于超时无法打开kernel】与【Pycharm 卡在启动界面】的方法

    目录 问题描述 解决方案 原因探究 问题描述 今儿打开Jupyter Notebook(vscode配置),刚运行就给我报一错.问题界面如下: 关键在于这条信息是立即报出的,并不是常见的timeout ...

  5. 什么是LSP???如何看待LSP???

    LSP: layered  service privider  分层服务提供商. LSP是TCP/IP等协议的接口. 浏览器,聊天工具等等都要通过这个接口来获取相应的信息. 删除不正确的(也称为&qu ...

  6. 重置 Winsock 目录解决电脑应用无法启动问题

    前言 前两天,因为部署测试环境,搞了一些无意操作,导致在内网域中我电脑的ip在该内网域内其它ip都能访问到,就只有这台服务器的ip访问不了:开始以为是服务器关机或者它出了什么问题,但是其它同事都能pi ...

  7. 不能随便输入的“netsh winsock reset”

    写这篇文章是因为我在cmd输入了题目中这段命令,结果问题越解决越麻烦.至于为什么输这段指令也是一个悲伤的故事,不再多说. netsh winsock reset 这个命令作用是重置 Winsock 目 ...

  8. 输入netsh winsock reset 重启电脑生效

    系统Win7 要用[管理员身份]打开cmd : 输入 netsh winsock reset :命令 要重启电脑才会生效, winsock是Windows网络编程接口,winsock工作在应用层. n ...

  9. 了解一下winsock

    最近碰到了ipv4协议的属性打不开,无法修改的问题,从而无法上网,网上寻求各种办法,其中有说是重置一下winsock,虽然依旧没有解决我的问题,不过还是很好奇winsock到底是个什么东东,所以又查了 ...

最新文章

  1. 火焰图(Flame Graphs)的安装和基本用法
  2. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
  3. java小知识_java小知识点简单回顾
  4. 看Quick Audience 如何有效提升营销活动管理效率
  5. matlab使用常犯的错误
  6. SQL语言基础:SQL中的数据完整性约束用法
  7. C++实现静态顺序表的增删查改以及初始化
  8. 【LeetCode】智商题 brainteaser(共3题)
  9. Ant学习---第一节:Ant安装和简单使用
  10. php 右下脚弹窗,多种样式jQuery网页右下角弹出提示信息代码
  11. 屏保壁纸引发血案,三星手机瞬间变砖
  12. linux之chsh命令
  13. 图:试图播放的文件扩展名与文件格式不匹配。播放该文件可能会导致意外行为...的解决办法
  14. [2018.10.20 T1] 蛋糕
  15. Qt4 在x86和arm平台上的一些配置
  16. 解决俄罗斯大shen精简版Win10无法远程的问题及同类精简版系统无法远程问题,简单快捷方法。
  17. named_struct类型怎么用
  18. 获取素材列表返回40004 invalid media type !(大坑)解决办法
  19. masm 16位汇编语法
  20. IP地址中A类、B类、C类地址的区别

热门文章

  1. SQLSERVER格式化日期时间
  2. vmware虚拟机实现两台电脑远程桌面连接
  3. 大数据告诉你何时何地买手机最划算!
  4. 2022年Unity客户端面试题总结
  5. 传感器网络知识点总结
  6. Mysql解决中文乱码
  7. 【微服务】配置了端口号却还是在 8080端口启动的原因
  8. python byte 和 list[int]互转(byte to list,list to byte,byte to int)
  9. 脱离文档流的三种方法
  10. 认认真真推荐几个一线IT大佬的公众号,值得收藏