关于Winsock:同时访问多个传输协议

必须在系统上正确安装传输协议,并在Windows套接字中注册才能访问应用程序。 Ws2_32.dll库导出一组函数以方便注册过程。 这包括创建新注册并删除现有注册。

创建新注册时,调用者(即堆栈供应商的安装脚本)提供一个或多个填充的WSAPROTOCOL_INFO结构,其中包含有关协议的完整信息集。 有关更多信息,请参阅Windows套接字2 SPI。 以这种方式安装的任何传输堆栈称为Windows套接字服务提供程序。

在带有Service Pack 2(SP2)的Windows XP,带有Service Pack 1(SP1)的Windows Server 2003和Windows Vista及更高版本上。 包含已安装的传输和命名空间提供程序列表的Winsock目录可以使用以下命令在命令提示符中显示:

netsh winsock显示目录

Microsoft Windows软件开发工具包(SDK)包括Sporder.exe,它允许用户查看和修改枚举服务提供程序的顺序。 使用Sporder.exe,如果存在多个此类堆栈,则用户可以手动将特定TCP / IP协议堆栈建立为默认TCP / IP提供程序。

Sporder.exe应用程序使用Sporder.dll中的导出函数来重新排序服务提供程序。 因此,安装应用程序可以使用Sporder.dll提供的接口以编程方式重新排序服务提供程序。

  • 分层协议和协议链
  • 使用多个协议
  • 选择的多个提供者限制

 

分层协议和协议链

Windows套接字2结合了分层协议的概念:一种只实现更高级别的通信功能,同时依靠底层传输堆栈与远程端点实际交换数据。 此类分层协议的一个示例是安全层,该协议将协议添加到套接字连接过程以执行身份验证并建立加密方案。 这种安全协议通常需要诸如TCP或SPX之类的底层且可靠的传输协议的服务。

术语基础协议指的是完全能够与远程端点执行数据通信的协议,例如TCP或SPX。 分层协议是一种不能独立的协议,而协议链是一个或多个分层协议,它们串在一起并由基本协议锚定。

如果您设计分层协议以在其上边缘和下边缘支持Windows Sockets 2 SPI,则可以创建协议链。 特殊的WSAPROTOCOL_INFO结构将协议链作为一个整体引用,并描述了分层协议连接的显式顺序。 这在下图中说明。 由于应用程序只能直接使用基本协议和协议链,因此只有在使用WSAEnumProtocols函数枚举安装的协议时,才会列出它们。

 

使用多个协议

应用程序使用WSAEnumProtocols函数来确定存在哪些传输协议和协议链,并获取有关每个传输协议和协议链中包含的相关WSAPROTOCOL_INFO结构的信息。

在大多数情况下,每个协议或协议链都有一个WSAPROTOCOL_INFO结构。 但是,某些协议表现出多种行为。 例如,SPX协议是面向消息的(即,发送者的消息边界由网络保留),但接收套接字可以忽略这些消息边界并将它们视为字节流。 因此,对于每个行为,SPX-one可以存在两个不同的WSAPROTOCOL_INFO结构条目。

在Windows套接字2中,会出现几个新的地址系列,套接字类型和协议值。 Windows Sockets 1.1支持IPv4的单个地址系列(AF_INET),它由少量众所周知的套接字类型和协议标识符组成。 出于兼容性原因,Windows套接字2保留现有的地址系列,套接字类型和协议标识符,但它还支持新媒体类型的新传输协议的新地址族值。

新的唯一标识符不一定是众所周知的,但这不应该成为问题。 鼓励需要独立于协议的应用程序根据其适用性而不是分配给其socket_type或协议参数的值来选择协议。 协议适用性由协议WSAPROTOCOL_INFO结构中包含的通信属性(如消息与字节流以及可靠与不可靠)指示。 选择基于适用性的协议而不是众所周知的协议名称和套接字类型,使协议无关的应用程序可以利用新的传输协议及其相关的媒体类型。

客户端/服务器应用程序的服务器一半通过在所有合适的传输协议上建立侦听套接字而受益。 然后,客户端可以使用任何合适的协议建立其连接。 例如,这将使客户端应用程序无需修改,无论它是在通过LAN连接的桌面系统上运行还是在使用无线网络的笔记本电脑上运行。

 

选择的多个提供者限制

select函数用于确定集合中一个或多个套接字的状态。 对于每个套接字,调用者可以请求有关读取,写入或错误状态的信息。 一组套接字由FD_SET结构指示。

Windows套接字2允许应用程序使用多个服务提供程序,但select函数仅限于与单个服务提供程序关联的一组套接字。 这绝不会限制应用程序通过多个提供程序打开多个套接字。

有两种方法可以确定跨越多个服务提供者的一组套接字的状态:

  • 使用阻塞语义时使用WSAWaitForMultipleEvents或WSAEventSelect函数。
  • 使用非阻塞操作并且应用程序已在使用Windows消息泵时使用WSAAsyncSelect函数。

当应用程序需要在跨越多个提供程序的一组套接字上使用阻塞语义时,建议使用WSAWaitForMultipleEvents。 应用程序还可以使用WSAEventSelect函数,该函数允许FD_XXX网络事件(请参阅WSAEventSelect)与事件对象关联,并在事件对象范例内进行处理(在重叠I / O和事件对象中描述)。

WSAAsyncSelect函数不限于单个提供程序,因为它将单个套接字描述符作为输入参数。 但请注意,WSAEventSelect函数提供了比WSAAsyncSelect更好的性能和可伸缩性,因为随着使用的套接字总数的增加,使用Winsock事件消息维护消息泵的开销也会增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值