WSASocketW 函数 (winsock2.h)

WSASocket 函数创建绑定到特定传输服务提供商的套接字。

语法

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

参数

[in] af

地址系列规范。 地址系列的可能值在 Winsock2.h 头文件中定义。

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

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

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

Af 意义
AF_UNSPEC
0
未指定地址系列。
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 或更高版本)。

[in] type

新套接字的类型规范。

套接字类型的可能值在 Winsock2.h 头文件中定义。

下表列出了 Windows 套接字 2 支持的 类型 参数的可能值:

类型 意义
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
提供基于数据报的伪流数据包的套接字类型。
 

在 Windows 套接字 2 中,引入了新的套接字类型。 应用程序可以通过 WSAEnumProtocols 函数动态发现每个可用传输协议的属性。 因此,应用程序可以确定地址系列可能的套接字类型和协议选项,并在指定此参数时使用此信息。 Winsock2.hWs2def.h 头文件中的套接字类型定义将定期更新,因为定义了新的套接字类型、地址系列和协议。

在 Windows 套接字 1.1 中,唯一可能的套接字类型是 SOCK_DGRAMSOCK_STREAM

[in] protocol

要使用的协议。 协议 参数的可能选项特定于指定的地址系列和套接字类型。 Winsock2.h 中定义了 协议 的可能值,Wsrm.h 头文件中定义。

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

如果指定了 0 值,则调用方不希望指定协议,服务提供商将选择要使用的 协议

af 参数AF_INET或AF_INET6且 类型SOCK_RAW时,协议 指定的值在 IPv6 或 IPv4 数据包标头的协议字段中设置。

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

协议 意义
IPPROTO_ICMP
1
Internet 控制消息协议(ICMP)。 当 af 参数 AF_UNSPECAF_INETAF_INET6类型 参数 SOCK_RAW 或未指定时,这是一个可能的值。

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

IPPROTO_IGMP
2
Internet 组管理协议(IGMP)。 当 af 参数 AF_UNSPECAF_INETAF_INET6类型 参数 SOCK_RAW 或未指定时,这是一个可能的值。

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

BTHPROTO_RFCOMM
3
蓝牙无线电频率通信(蓝牙 RFCOMM)协议。 当 af 参数 AF_BTH类型 参数 SOCK_STREAM时,这是一个可能的值。

Windows XP 支持此 协议 值(SP2 或更高版本)。

IPPROTO_TCP
6
传输控制协议 (TCP)。 当 af 参数 AF_INETAF_INET6类型 参数 SOCK_STREAM时,此值是可能的。
IPPROTO_UDP
17
用户数据报协议(UDP)。 当 af 参数 AF_INETAF_INET6类型 参数 SOCK_DGRAM时,此值是可能的。
IPPROTO_ICMPV6
58
Internet 控制消息协议版本 6 (ICMPv6)。 当 af 参数 AF_UNSPECAF_INETAF_INET6类型 参数 SOCK_RAW 或未指定时,这是一个可能的值。

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

IPPROTO_RM
113
可靠多播的 PGM 协议。 当 af 参数 AF_INET类型 参数 SOCK_RDM时,这是一个可能的值。 在适用于 Windows Vista 及更高版本的 Windows SDK 上,此协议也称为 IPPROTO_PGM

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

[in] lpProtocolInfo

指向 WSAPROTOCOL_INFO 结构的指针,用于定义要创建的套接字的特征。 如果此参数未 NULL,则套接字将绑定到与所指示 WSAPROTOCOL_INFO 结构关联的提供程序。

[in] g

创建新套接字组和新套接字组组时要采取的现有套接字组 ID 或相应的作。

如果 g 是现有的套接字组 ID,请将新套接字加入此套接字组,前提是满足此组设置的所有要求。

如果 g 不是现有的套接字组 ID,则可以使用以下值。

g 意义
0
不执行组作。
SG_UNCONSTRAINED_GROUP
0x01
创建不受约束的套接字组,并将新套接字作为第一个成员。 对于不受约束的组,Winsock 不会限制套接字组中的所有套接字,这些套接字组的值与 类型协议 参数的值相同。
SG_CONSTRAINED_GROUP
0x02
创建受约束的套接字组,并将新套接字设为第一个成员。 对于受约束的套接字组,Winsock 将约束套接字组中的所有套接字,这些套接字组的值与 类型协议 参数的值相同。 受约束的套接字组只能包含面向连接的套接字,并且要求所有分组套接字上的连接都与同一主机上的同一地址建立连接。
 
注释 公共头文件中当前未定义SG_UNCONSTRAINED_GROUP和SG_CONSTRAINED_GROUP常量。
 

[in] dwFlags

一组标志,用于指定其他套接字属性。

可以设置这些标志的组合,尽管不允许某些组合。

价值 意义
WSA_FLAG_OVERLAPPED
0x01
创建支持重叠 I/O作的套接字。

应使用此标志集创建大多数套接字。 重叠套接字可以利用 WSASendWSASendToWSARecvWSARecvFrom,以及 WSAIoctl 进行重叠的 I/O作,从而允许同时启动和进行多个作。

允许重叠作的所有函数(WSASendWSARecvWSASendToWSARec如果与重叠作相关的参数的值 NULL,则 WSAIoctl)也支持对重叠套接字使用非重叠用法。

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
创建将在多点会话中c_root的套接字。

仅当创建套接字的传输提供程序的 WSAPROTOCOL_INFO 结构支持多点或多播机制且多点会话的控制平面已建立根时,才允许此属性。 这将由 WSAPROTOCOL_INFO 结构的 dwServiceFlags1 成员指示,并设置了 XP1_SUPPORT_MULTIPOINTXP1_MULTIPOINT_CONTROL_PLANE 标志。

lpProtocolInfo 参数不为 NULL 时,传输提供程序 WSAPROTOCOL_INFO 结构由 lpProtocolInfo 参数指向。 当 lpProtocolInfo 参数为 NULL 时,WSAPROTOCOL_INFO 结构基于 af类型协议 参数指定的值选择的传输提供程序。

有关多点会话的其他信息,请参阅 多点和多播语义

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
创建将成为多点会话中的c_leaf的套接字。

仅当创建套接字的传输提供程序的 WSAPROTOCOL_INFO 结构支持多点或多播机制且多点会话的控制平面不是根的时,才允许此属性。 这将由 WSAPROTOCOL_INFO 结构的 dwServiceFlags1 成员指示,该结构设置了 XP1_SUPPORT_MULTIPOINT 标志,并且未设置 XP1_MULTIPOINT_CONTROL_PLANE 标志。

lpProtocolInfo 参数不为 NULL 时,传输提供程序 WSAPROTOCOL_INFO 结构由 lpProtocolInfo 参数指向。 当 lpProtocolInfo 参数为 NULL 时,WSAPROTOCOL_INFO 结构基于 af类型协议 参数指定的值选择的传输提供程序。

有关多点会话的其他信息,请参阅 多点和多播语义

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
创建将在多点会话中d_root的套接字。

仅当创建套接字的传输提供程序的 WSAPROTOCOL_INFO 结构支持多点或多播机制且多点会话的数据平面已建立根时,才允许此属性。 这将由 WSAPROTOCOL_INFO 结构的 dwServiceFlags1 成员指示,并设置了 XP1_SUPPORT_MULTIPOINTXP1_MULTIPOINT_DATA_PLANE 标志。

lpProtocolInfo 参数不为 NULL 时,传输提供程序 WSAPROTOCOL_INFO 结构由 lpProtocolInfo 参数指向。 当 lpProtocolInfo 参数为 NULL 时,WSAPROTOCOL_INFO 结构基于 af类型协议 参数指定的值选择的传输提供程序。

有关多点会话的其他信息,请参阅 多点和多播语义

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
创建将成为多点会话中的d_leaf的套接字。

仅当创建套接字的传输提供程序的 WSAPROTOCOL_INFO 结构支持多点或多播机制,并且多点会话的数据平面不具有根性时,才允许此属性。 这将由 WSAPROTOCOL_INFO 结构的 dwServiceFlags1 成员指示,该 XP1_SUPPORT_MULTIPOINT 标志集和未设置 XP1_MULTIPOINT_DATA_PLANE 标志。

lpProtocolInfo 参数不为 NULL 时,传输提供程序 WSAPROTOCOL_INFO 结构由 lpProtocolInfo 参数指向。 当 lpProtocolInfo 参数为 NULL 时,WSAPROTOCOL_INFO 结构基于 af类型协议 参数指定的值选择的传输提供程序。

有关多点会话的其他信息,请参阅 多点和多播语义

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
创建一个套接字,该套接字允许在套接字上设置安全描述符,该套接字包含安全访问控制列表(SACL),而不只是自由访问控制列表(DACL)。

SCL 用于在对象上执行访问检查时生成审核和警报。 对于套接字,会发生访问检查,以确定是否应允许套接字绑定到指定给 绑定 函数的特定地址。

ACCESS_SYSTEM_SECURITY 访问权限控制在对象的安全描述符中获取或设置 SACL 的能力。 仅当请求线程的访问令牌中启用了 SE_SECURITY_NAME 特权时,系统才授予此访问权限。

WSA_FLAG_NO_HANDLE_INHERIT
0x80
创建不可继承的套接字。

默认情况下,WSASocket 创建的套接字句柄或 套接字 函数可继承。 设置此标志时,套接字句柄不可继承。

可以使用 GetHandleInformation 函数来确定是否已使用 WSA_FLAG_NO_HANDLE_INHERIT 标志集创建套接字句柄。 GetHandleInformation 函数将返回设置 HANDLE_FLAG_INHERIT 值。

Windows 7 SP1、Windows Server 2008 R2 SP1 及更高版本支持此标志

 
重要 对于多点套接字,只能指定 WSA_FLAG_MULTIPOINT_C_ROOTWSA_FLAG_MULTIPOINT_C_LEAF 标志之一,只能指定 WSA_FLAG_MULTIPOINT_D_ROOTWSA_FLAG_MULTIPOINT_D_LEAF 标志之一。 有关其他信息,请参阅 多点和多播语义
 

返回值

如果未发生错误,WSASocket 将返回引用新套接字的描述符。 否则,将返回INVALID_SOCKET值,并通过调用 WSAGetLastError来检索特定的错误代码。

注意 此错误代码说明特定于Microsoft。
 
错误代码 意义
WSANOTINITIALIZED
在使用此函数之前,必须成功 WSAStartup 调用。
WSAENETDOWN
网络子系统已失败。
WSAEAFNOSUPPORT
不支持指定的地址系列。
WSAEFAULT
lpProtocolInfo 参数不在进程地址空间的有效部分。
WSAEINPROGRESS
正在阻止 Windows 套接字 1.1 调用,或者服务提供商仍在处理回调函数。
WSAEINVAL
对于以下任一条件,此值为 true。
  • 指定的参数 g 无效。
  • lpProtocolInfo 指向的 WSAPROTOCOL_INFO 结构不完整,内容无效或 WSAPROTOCOL_INFO 结构已在早期重复套接字作中使用。
  • 单独支持套接字三重 <af类型协议> 的成员指定的值,但给定的组合则不受支持。
WSAEINVALIDPROVIDER
服务提供商返回了 2.2 以外的版本。
WSAEINVALIDPROCTABLE
服务提供商将无效或不完整的过程表返回到 WSPStartup
WSAEMFILE
没有更多套接字描述符可用。
WSAENOBUFS
没有可用的缓冲区空间。 无法创建套接字。
WSAEPROTONOSUPPORT
不支持指定的协议。
WSAEPROTOTYPE
指定的协议是此套接字的错误类型。
WSAEPROVIDERFAILEDINIT
服务提供程序无法初始化。 如果分层服务提供商(LSP)或命名空间提供程序安装不当,或者提供程序无法正常运行,则返回此错误。
WSAESOCKTNOSUPPORT
此地址系列不支持指定的套接字类型。

言论

WSASocket 函数会导致分配套接字描述符以及与传输服务提供商关联的任何相关资源。 大多数套接字都应使用在 dwFlags 参数中设置的 WSA_FLAG_OVERLAPPED 属性创建。 使用此属性创建的套接字支持使用重叠的 I/O作,从而提供更高的性能。 默认情况下,使用 WSASocket 函数创建的套接字不会设置此重叠的属性。 相比之下,套接字 函数将创建支持重叠 I/O作作为默认行为的套接字。

如果 lpProtocolInfo 参数 NULL,Winsock 将使用第一个可用的传输服务提供商,该提供程序支持 af中指定的地址系列、套接字类型和协议的请求组合、类型协议 参数。

如果 lpProtocolInfo 参数未 NULL,则套接字将绑定到与指示 WSAPROTOCOL_INFO 结构关联的提供程序。 在此实例中,应用程序可以提供清单常量 FROM_PROTOCOL_INFO 作为任何 af类型协议 参数的值。 这表示将假定来自所指示 WSAPROTOCOL_INFO 结构(iAddressFamilyiSocketTypeiProtocol)中的相应值。 在任何情况下,为 af类型指定的值,并将 协议 传递给传输服务提供商。

选择协议及其支持服务提供商时,基于 af类型协议,此过程将仅选择基协议或协议链,而不是协议层本身。 未链接的协议层不被视为在 类型af上具有部分匹配项。 也就是说,如果未找到合适的协议,则它们不会导致 WSAEAFNOSUPPORTWSAEPROTONOSUPPORT的错误代码。

注意 清单常量 AF_UNSPEC 继续在头文件中定义,但强烈建议不要使用清单常量,因为这可能会导致解释 协议 参数的值存在歧义。
 
鼓励应用程序对 af 参数使用 AF_INET6,并创建可用于 IPv4 和 IPv6 的双模式套接字。

如果使用 WSASocket 函数创建套接字,则 dwFlags 参数必须具有为 SO_RCVTIMEOSO_SNDTIMEO 套接字选项设置 WSA_FLAG_OVERLAPPED 属性才能正常工作。 否则,超时永远不会对套接字生效。

面向连接的套接字(如 SOCK_STREAM)提供全双工连接,并且必须处于连接状态,然后才能在它们上发送或接收任何数据。 使用 连接WSAConnect 函数调用建立与指定套接字的连接。 连接后,可以使用 发送/WSASendrecv/WSARecv 调用传输数据。 会话完成后,应调用 closesocket 函数以释放与套接字关联的资源。 对于面向连接的套接字,应在调用 closesocket 函数之前调用 关闭 函数来停止套接字上的数据传输。

用于实现可靠、面向连接的套接字的通信协议可确保数据不会丢失或复制。 如果对等协议具有缓冲区空间的数据无法在合理的时间内成功传输,则连接被视为断开,后续调用将失败,错误代码设置为 WSAETIMEDOUT

无连接、面向消息的套接字允许使用 sendto/WSASendTorecvfrom/WSARecvFrom向任意对等方发送和接收数据报。 如果此类套接字连接到特定对等方,则可以使用 发送/WSASend 发送到该对等方,并且只能使用 recv/WSARecv从此对等方接收数据报。

不需要支持类型为 SOCK_RAW 的套接字,但建议服务提供商尽可能支持原始套接字。

WSASocket 函数可用于创建服务要使用的套接字,以便如果另一个套接字尝试绑定到服务使用的同一端口,并生成审核记录。 若要启用此选项,应用程序需要执行以下作:

  • 调用 AdjustTokenPrivileges 函数,以便在进程的访问令牌中启用 SE_SECURITY_NAME 特权。 需要此权限才能设置对对象的安全描述符的 ACCESS_SYSTEM_SECURITY 访问权限。
  • 调用 WSASocket 函数,以使用 WSA_FLAG_ACCESS_SYSTEM_SECURITY 选项集创建具有 dwFlag 的套接字。 如果未首先调用 AdjustTokenPrivileges 函数来启用此作所需的 SE_SECURITY_NAME 特权,则 WSASocket 函数将失败。
  • 调用 SetSecurityInfo 函数,以在套接字上使用系统访问控制列表(SACL)设置安全描述符。 WSASocket 函数返回的套接字句柄在 句柄 参数中传递。 如果函数成功,则会在套接字的安全描述符上设置 ACCESS_SYSTEM_SECURITY 访问权限。
  • 调用 绑定 函数将套接字绑定到特定端口。 如果 绑定 函数成功,则当另一个套接字尝试绑定到同一端口时,将生成审核条目。
  • 调用 AdjustTokenPrivileges 函数以删除进程的访问令牌中的 SE_SECURITY_NAME 特权,因为不再需要此权限。

有关 ACCESS_SYSTEM_SECURITY的详细信息,请参阅授权文档中 SACL 访问权限审核生成

套接字组

WinSock 2 引入了套接字组的概念,作为应用程序或合作应用程序集的方法,以向基础服务提供商指示一组特定的套接字是相关的,因此构成的组具有某些属性。 组属性包括组中各个套接字的相对优先级,以及一个组服务质量规范。

需要通过网络交换多媒体流的应用程序是一个示例,即能够在一组套接字之间建立特定关系可能很有益。 它取决于如何处理套接字组的传输。

WSASocketWSAAccept 函数可用于在新套接字时显式创建和加入套接字组。 可以使用 getsockopt 函数检索套接字的套接字组 ID,并将 级别 参数设置为 SOL_SOCKEToptname 参数设置为 SO_GROUP_ID。 在关闭属于此套接字组的最后一个套接字之前,套接字组及其关联的套接字组 ID 保持有效。 套接字组 ID 在给定服务提供商的所有进程中都是唯一的。 零的套接字组表示套接字不是套接字组的成员。

可以使用 getsockopt 函数访问套接字组的相对组优先级,并将 级别 参数设置为 SOL_SOCKEToptname 参数设置为 SO_GROUP_PRIORITY。 可以使用 setsockopt 设置套接字组的相对组优先级,并将 级别 参数设置为SOL_SOCKET,并将 optname 参数设置为 SO_GROUP_PRIORITY

Windows 附带的 Winsock 提供程序允许创建套接字组,并强制实施SG_CONSTRAINED_GROUP。 必须使用与 类型协议 参数相同的值创建受约束套接字组中的所有套接字。 受约束的套接字组只能包含面向连接的套接字,并且要求所有分组套接字上的连接都与同一主机上的同一地址建立连接。 这是 Windows 附带的 Winsock 提供程序应用于套接字组的唯一限制。 Winsock 提供程序或 Windows 附带的 TCP/IP 堆栈当前不使用套接字组优先级。

示例代码

以下示例演示如何使用 WSASocket 函数。
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8: Windows Phone 8 及更高版本的 Windows Phone 应用商店应用支持 WSASocketW 功能。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持 WSASocketW 功能。

注意

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

要求

要求 价值
最低支持的客户端 Windows 8.1、Windows Vista [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 窗户
标头 winsock2.h
Ws2_32.lib
DLL Ws2_32.dll

另请参阅

WSAPROTOCOL_INFO

Winsock 函数

Winsock 参考

接受

绑定

closesocket

连接

getsockname

getsockopt

ioctlsocket

侦听

recv

recvfrom

选择

发送

sendto

setsockopt

关闭

套接字