WSASocketA 函数 (winsock2.h)

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

语法

SOCKET WSAAPI WSASocketA(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOA 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 地址系列格式。 用于 NetBIOS 的地址系列 (AF_NETBIOS 的其他选项,例如,如果安装了地址系列的 Windows 套接字服务提供商,则支持) 。 请注意,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 套接字提供程序时,才支持此地址系列。

32 位版本的 Windows 支持 NetBIOS 的 Windows 套接字提供程序。 默认情况下,此提供程序安装在 32 位版本的 Windows 上。

64 位版本的 Windows 不支持 NetBIOS 的 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 (IrDA) 地址系列。

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

AF_BTH
32
蓝牙地址系列。

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

[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.hWsrm.h 头文件中定义。

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

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

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

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

protocol 含义
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时,这是一个可能的值。

具有 SP2 或更高版本的 Windows XP 支持此 协议 值。

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 操作的套接字。

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

如果与重叠操作相关的参数的值为 NULL,则允许重叠操作 (WSASendWSARecvFromWSAIoctl) 的所有函数也支持在重叠套接字上使用非重叠操作。

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
创建一个套接字,该套接字将成为多点会话中的c_root。

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

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

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

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

仅当创建套接字的传输提供程序 的WSAPROTOCOL_INFO 结构支持多点或多播机制,并且多点会话的控制平面为非 root 时,才允许此属性。 这由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 结构支持多点或多播机制,并且多点会话的数据平面为 root 时,才允许此属性。 这将由设置了XP1_SUPPORT_MULTIPOINT和XP1_MULTIPOINT_DATA_PLANE标志的 WSAPROTOCOL_INFO 结构的 dwServiceFlags1 成员指示。

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

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

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

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

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值。

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

 
重要 对于多点套接字,只能指定 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类型协议 参数的值。 这表示假定 (iAddressFamilyiSocketTypeiProtocol) 所示WSAPROTOCOL_INFO结构中的相应值。 在任何情况下,为 af类型和协议指定的值均未修改地传递给传输服务提供商。

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

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

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

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

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

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

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

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

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

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

套接字组

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

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

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

可以使用将级别参数设置为 SOL_SOCKET 且 optname 参数设置为 SO_GROUP_PRIORITYgetsockopt 函数来访问套接字组的相对优先级。 可以使用 setockopt 设置套接字组的相对组优先级, 并将级别 参数设置为 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 应用]
目标平台 Windows
标头 winsock2.h
Library Ws2_32.lib
DLL Ws2_32.dll

另请参阅

WSAPROTOCOL_INFO

Winsock 函数

Winsock 参考

accept

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

recv

recvfrom

select

send

sendto

setsockopt

shutdown

socket