WSAPROTOCOL_INFOW结构(winsock2.h)

WSAPROTOCOL_INFOW 结构用于存储或检索给定协议的完整信息。 协议名称表示为 Unicode 字符数组。

语法

typedef struct _WSAPROTOCOL_INFOW {
  DWORD            dwServiceFlags1;
  DWORD            dwServiceFlags2;
  DWORD            dwServiceFlags3;
  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;
  DWORD            dwMessageSize;
  DWORD            dwProviderReserved;
  WCHAR            szProtocol[WSAPROTOCOL_LEN + 1];
} WSAPROTOCOL_INFOW, *LPWSAPROTOCOL_INFOW;

成员

dwServiceFlags1

类型:DWORD

描述协议提供的服务的位掩码。 此成员的可能值在 Winsock2.h 头文件中定义。

可以使用以下值。

价值 意义
XP1_CONNECTIONLESS
0x00000001
提供无连接(数据报)服务。 如果未设置,协议支持面向连接的数据传输。
XP1_GUARANTEED_DELIVERY
0x00000002
保证发送的所有数据都将到达预期目标。
XP1_GUARANTEED_ORDER
0x00000004
保证数据仅按发送顺序到达,且数据不重复。 此特征不一定意味着数据始终传递,但传递的任何数据都按发送顺序传递。
XP1_MESSAGE_ORIENTED
0x00000008
遵循消息边界,而不是基于流的协议,其中没有消息边界的概念。
XP1_PSEUDO_STREAM
0x00000010
面向消息的协议,但所有回执都会忽略消息边界。 当应用程序不希望协议完成消息帧时,这很方便。
XP1_GRACEFUL_CLOSE
0x00000020
支持两阶段(正常)关闭。 如果未设置,则只执行中止关闭。
XP1_EXPEDITED_DATA
0x00000040
支持加速(紧急)数据。
XP1_CONNECT_DATA
0x00000080
支持连接数据。
XP1_DISCONNECT_DATA
0x00000100
支持断开连接数据。
XP1_SUPPORT_BROADCAST
0x00000200
支持广播机制。
XP1_SUPPORT_MULTIPOINT
0x00000400
支持多点或多播机制。 控件和数据平面属性如下所示。
XP1_MULTIPOINT_CONTROL_PLANE
0x00000800
指示控制平面是根(值 = 1)还是非根(值 = 0)。
XP1_MULTIPOINT_DATA_PLANE
0x00001000
指示数据平面是根(值 = 1)还是非根(值 = 0)。
XP1_QOS_SUPPORTED
0x00002000
支持服务质量请求。
XP1_INTERRUPT
位是保留的。
XP1_UNI_SEND
0x00008000
协议在发送方向是单向的。
XP1_UNI_RECV
0x00010000
协议在 recv 方向是单向的。
XP1_IFS_HANDLES
0x00020000
提供程序返回的套接字描述符是操作系统可安装文件系统 (IFS) 句柄。
XP1_PARTIAL_MESSAGE
0x00040000
WSASendWSASendTo支持MSG_PARTIAL标志。
XP1_SAN_SUPPORT_SDP
0x00080000
协议为 SAN 提供支持。

Windows 7 和 Windows Server 2008 R2 支持此值。

 
注意 只能设置XP1_UNI_SEND或XP1_UNI_RECV值之一。 如果协议可以在任一方向单向,则应使用两个 WSAPROTOCOL_INFOW 结构。 如果未设置这两个位,则协议被视为双向。
 

dwServiceFlags2

类型:DWORD

为其他协议属性定义保留。

dwServiceFlags3

类型:DWORD

为其他协议属性定义保留。

dwServiceFlags4

类型:DWORD

为其他协议属性定义保留。

dwProviderFlags

类型:DWORD

一组标志,提供有关 Winsock 目录中此协议的表示方式的信息。 此成员的可能值在 Winsock2.h 头文件中定义。

可以使用以下值。

价值 意义
PFL_MULTIPLE_PROTO_ENTRIES
0x00000001
指示这是单个协议(来自给定提供程序)的两个或多个条目之一,能够实现多个行为。 例如,SPX 在接收端可以充当面向消息的协议或面向流的协议。
PFL_RECOMMENDED_PROTO_ENTRY
0x00000002
指示这是能够实现多个行为的协议的建议或最常用的条目。
PFL_HIDDEN
0x00000004
由提供程序设置,以指示不应在 Ws2_32.dll WSAEnumProtocols生成的结果缓冲区中返回此协议。 显然,Windows 套接字 2 应用程序不应该看到具有此位集的条目。
PFL_MATCHES_PROTOCOL_ZERO
0x00000008
指示 套接字WSASocket协议 参数中的零值与此协议项匹配。
PFL_NETWORKDIRECT_PROVIDER
0x00000010
由提供程序设置,指示对网络直接访问的支持。

Windows 7 和 Windows Server 2008 R2 支持此值。

ProviderId

类型:GUID

由服务提供商供应商分配给提供程序的全局唯一标识符(GUID)。 此值对于多个服务提供商能够实现特定协议的实例非常有用。 应用程序可以使用 ProviderId 成员来区分可能不区分的提供程序。

dwCatalogEntryId

类型:DWORD

由每个 WSAPROTOCOL_INFO 结构的WS2_32.DLL分配的唯一标识符。

ProtocolChain

类型:WSAPROTOCOLCHAIN

与协议关联的 WSAPROTOCOLCHAIN 结构。 如果链的长度为 0,则此 WSAPROTOCOL_INFO 条目表示分层协议,该协议具有 Windows 套接字 2 SPI 作为其上边缘和下边缘。 如果链的长度等于 1,则此条目表示其目录条目标识符位于 WSAPROTOCOL_INFO 结构的 dwCatalogEntryId 成员的基协议。 如果链的长度大于 1,则此条目表示一个协议链,该链由基协议上的一个或多个分层协议组成。 相应的目录条目标识符位于 ProtocolChain.ChainEntries 数组中,从顶部的分层协议(ProtocolChain.ChainEntries 数组中的零元素)开始,以基本协议结尾。 有关协议链的详细信息,请参阅 Windows 套接字 2 服务提供程序接口规范。

iVersion

类型:int

协议版本标识符。

iAddressFamily

类型:int

要作为地址系列参数传递给 套接字WSASocket 函数的值,以便为此协议打开套接字。 此值还唯一定义协议使用的 sockaddr 协议的协议地址结构。

在适用于 Windows Vista 及更高版本的 Windows SDK 上,地址系列的可能值在 Ws2def.h 头文件中定义。 请注意,Ws2def.h 头文件自动包含在 Winsock2.h中,不应直接使用。

在 Windows Server 2003 及更早版本的平台 SDK 上,地址系列的可能值在 Winsock2.h 头文件中定义。

当前支持的值是AF_INET或AF_INET6,它们是 IPv4 和 IPv6 的 Internet 地址系列格式。 如果安装了地址系列的 Windows 套接字服务提供商,则支持用于 NetBIOS 的其他地址系列选项(例如AF_NETBIOS)。 请注意,AF_地址系列和PF_协议系列常量的值相同(例如,AF_INETPF_INET),因此可以使用任一常量。

下表列出了地址系列的公共值,尽管可能还有其他许多值。

iAddressFamily 意义
AF_INET
2
Internet 协议版本 4 (IPv4) 地址系列。
AF_IPX
6
IPX/SPX 地址系列。 仅当安装了 NWLink IPX/SPX NetBIOS 兼容传输协议时,才支持此地址系列。

Windows Vista 及更高版本不支持此地址系列。

AF_APPLETALK
16
AppleTalk 地址系列。 仅当安装了 AppleTalk 协议时,才支持此地址系列。

Windows Vista 及更高版本不支持此地址系列。

AF_NETBIOS
17
NetBIOS 地址系列。 仅当安装了适用于 NetBIOS 的 Windows 套接字提供程序时,才支持此地址系列。

适用于 NetBIOS 的 Windows 套接字提供程序在 32 位版本的 Windows 上受支持。 此提供程序默认安装在 32 位版本的 Windows 上。

适用于 NetBIOS 的 Windows 套接字提供程序在 64 位版本的 Windows 上不受支持,包括 Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 或 Windows XP。

NetBIOS 的 Windows 套接字提供程序仅支持 类型 参数设置为 SOCK_DGRAM的套接字。

适用于 NetBIOS 的 Windows 套接字提供程序与 NetBIOS 编程接口不直接相关。 Windows Vista、Windows Server 2008 及更高版本不支持 NetBIOS 编程接口。

AF_INET6
23
Internet 协议版本 6 (IPv6) 地址系列。
AF_IRDA
26
红外数据关联(IrDA)地址系列。

仅当计算机安装了红外端口和驱动程序时,才支持此地址系列。

AF_BTH
32
蓝牙地址系列。

如果安装了蓝牙适配器和驱动程序,则 Windows XP 支持此地址系列(SP2 或更高版本)。

iMaxSockAddr

类型:int

最大地址长度(以字节为单位)。

iMinSockAddr

类型:int

最小地址长度(以字节为单位)。

iSocketType

类型:int

要作为套接字类型参数传递给 套接字WSASocket 函数的值,以便为此协议打开套接字。 套接字类型的可能值在 Winsock2.h 头文件中定义。

下表列出了 windows 套接字 2 支持的 iSocketType 成员的可能值:

iSocketType 意义
SOCK_STREAM
1
一种套接字类型,它提供具有 OOB 数据传输机制的有序、可靠、双向的基于连接的字节流。 此套接字类型使用 Internet 地址系列(AF_INET或AF_INET6)的传输控制协议(TCP)。
SOCK_DGRAM
2
支持数据报的套接字类型,这些数据报是固定(通常较小)最大长度的无连接、不可靠的缓冲区。 此套接字类型使用 Internet 地址系列(AF_INET或AF_INET6)的用户数据报协议(UDP)。
SOCK_RAW
3
提供原始套接字的套接字类型,允许应用程序操作下一层协议标头。 若要操作 IPv4 标头,必须在套接字上设置 IP_HDRINCL 套接字选项。 若要操作 IPv6 标头,必须在套接字上设置 IPV6_HDRINCL 套接字选项。
SOCK_RDM
4
提供可靠消息数据报的套接字类型。 此类型的一个示例是 Windows 中的实用常规多播(PGM)多播协议实现,通常称为 可靠的多播编程

仅当安装了可靠多播协议时,才支持此值。

SOCK_SEQPACKET
5
提供基于数据报的伪流数据包的套接字类型。

iProtocol

类型:int

要作为 协议 参数传递给 套接字WSASocket 函数的值,以便为此协议打开套接字。 iProtocol 成员的可能选项特定于指定的地址系列和套接字类型。

在适用于 Windows Vista 及更高版本的 Windows SDK 上,此成员可以是 Ws2def.h 头文件中定义的 IPPROTO 枚举类型之一。 请注意,Ws2def.h 头文件自动包含在 Winsock2.h中,不应直接使用。

在 Windows Server 2003 及更早版本的平台 SDK 上,iProtocol 成员的可能值在 Winsock2.hWsrm.h 头文件中定义。

下表列出了 iProtocol 的常见值,尽管可能还有其他许多值。

iProtocol 意义
IPPROTO_ICMP
1
Internet 控制消息协议(ICMP)。

Windows XP 及更高版本支持此值。

IPPROTO_IGMP
2
Internet 组管理协议(IGMP)。

Windows XP 及更高版本支持此值。

BTHPROTO_RFCOMM
3
蓝牙无线电频率通信(蓝牙 RFCOMM)协议。

SP2 或更高版本在 Windows XP 上支持此值。

IPPROTO_TCP
6
传输控制协议 (TCP)。
IPPROTO_UDP
17
用户数据报协议(UDP)。
IPPROTO_ICMPV6
58
Internet 控制消息协议版本 6 (ICMPv6)。

Windows XP 及更高版本支持此值。

IPPROTO_RM
113
可靠多播的 PGM 协议。 在适用于 Windows Vista 及更高版本的 Windows SDK 上,此协议也称为 IPPROTO_PGM

仅当安装了可靠多播协议时,才支持此值。

iProtocolMaxOffset

类型:int

套接字WSASocket提供 协议 参数的值时,可以添加到 iProtocol 成员的最大值。 并非所有协议都允许一系列值。 当这种情况 iProtocolMaxOffset 为零时。

iNetworkByteOrder

类型:int

目前,这些值为清单常量(BIGENDIAN 和 LITTLEENDIAN),分别指示值为 0 和 1 的 big-endian 或 little-endian。

iSecurityScheme

类型:int

采用的安全方案类型(如果有)。 SECURITY_PROTOCOL_NONE (0) 的值用于不包含安全预配的协议。

dwMessageSize

类型:DWORD

协议支持的最大消息大小(以字节为单位)。 这是可从任何主机的本地接口发送的最大大小。 对于不支持消息帧的协议,可以发送到给定地址的实际最大值可能更少。 没有用于确定最大入站消息大小的标准预配。 定义了以下特殊值。

价值 意义
0
协议面向流,因此消息大小的概念不相关。
0x1
最大出站(发送)消息大小取决于基础网络 MTU(最大大小传输单元),因此在套接字绑定后才能知道。 应用程序应使用 getsockopt 检索套接字绑定到本地地址后SO_MAX_MSG_SIZE的值。
0xFFFFFFFF
协议面向消息,但可能传输的消息大小没有最大限制。

dwProviderReserved

类型:DWORD

保留供服务提供商使用。

szProtocol[WSAPROTOCOL_LEN + 1]

类型:WCHAR[WSAPROTOCOL_LEN+1]

Unicode 字符数组,其中包含标识协议的可读名称,例如“MSAFD Tcpip [UDP/IP]”。 允许的最大字符数是WSAPROTOCOL_LEN,定义为 255。

言论

注意

winsock2.h 标头将WSAPROTOCOL_INFO定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
标头 winsock2.h

另请参阅

WSAPROTOCOLCHAIN

WSAPROTOCOL_INFO

WSASend

WSASendTo

WSASocket

WSCEnumProtocols

WSCEnumProtocols32

getsockopt

套接字