LPWSPSOCKET 回调函数 (ws2spi.h)
LPWSPSocket 函数创建套接字。 有关 LPWSPSocket 在创建共享套接字时所扮演的部分的信息,请参阅 SPI 中的共享套接字和共享套接字。
语法
LPWSPSOCKET Lpwspsocket;
SOCKET Lpwspsocket(
[in] int af,
[in] int type,
[in] int protocol,
[in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
[in] GROUP g,
DWORD dwFlags,
[out] LPINT lpErrno
)
{...}
参数
[in] af
地址系列规范。
[in] type
新套接字的类型规范。
[in] protocol
要与特定于所指示的地址系列的套接字配合使用的协议。
[in] lpProtocolInfo
指向 WSAProtocol_Info 结构的指针,该结构定义要创建的套接字的特征。
[in] g
保留。
dwFlags
套接字属性规范。
[out] lpErrno
指向错误代码的指针。
返回值
如果未发生错误, LPWSPSocket 将返回引用新套接字的描述符。 否则,返回值 INVALID_SOCKET,lpErrno 中提供了特定的错误代码。
错误代码 | 含义 |
---|---|
网络子系统发生故障。 | |
:不支持指定的地址系列。 | |
正在阻止 Windows 套接字调用,或者服务提供商仍在处理回调函数。 | |
无法提供更多套接字描述符。 | |
未提供任何缓冲区空间。 无法创建套接字。 | |
指定的协议不受支持。 | |
指定的协议是此套接字的错误类型。 | |
:在此地址系列中,不支持指定的套接字类型。 | |
指定的参数 g 无效。 |
注解
LPWSPSocket 函数会导致分配套接字描述符和任何相关资源。 默认情况下,创建的套接字不会具有重叠属性。 建议将 Windows 套接字提供程序实现为 Windows 可安装的文件系统,并提供系统文件句柄作为套接字描述符。 这些提供程序必须在从此函数返回之前调用 WPUModifyIFSHandle 。 对于非文件系统 Windows 套接字提供程序,在从此函数返回之前,必须使用 WPUCreateSocketHandle 从 Ws2_32.dll 获取唯一的套接字描述符。 请参阅
有关详细信息,描述符分配 。
af、type 和 protocol 的值是应用程序在相应的 API 函数套接字或 WSASocket 中提供的值。 服务提供商可以随意忽略或关注适用于特定协议的任何或全部值。 但是,提供程序必须愿意接受 af 和 type 的零值,因为 Ws2_32.dll 将这些值视为通配符值。 此外,对于任何 af、类型和协议,都必须接受清单常量FROM_PROTOCOL_INFO的值。 此值指示 Windows 套接字 2 应用程序需要使用 WSAProtocol_Info 结构 (iAddressFamily、 iSocketType、 iProtocol) 中的相应值。
dwFlags 参数可用于指定套接字的属性,方法是使用带以下任何标志的按位 OR 运算符。
标志 | 含义 |
---|---|
WSA_FLAG_OVERLAPPED | 此标志会导致创建重叠的套接字。 重叠套接字可以利用 LPWSPSend、 LPWSPSendTo、 LPWSPRecv、 LPWSPRecvFrom 和 LPWSPIoctl 进行重叠的 I/O 操作,从而允许同时启动和处理多个操作。 如果与重叠操作相关的参数的值为 null,则允许重叠操作的所有函数也支持在重叠套接字上使用非重叠。 |
WSA_FLAG_MULTIPOINT_C_ROOT | 指示创建的套接字将是多点会话中的c_root。 仅当协议的 WSAProtocol_Info 结构中指示了根控制平面时,才允许。 |
WSA_FLAG_MULTIPOINT_C_LEAF | 指示创建的套接字将是多播会话中的c_leaf。 仅当协议的 WSAProtocol_Info结构中 指示XP1_SUPPORT_MULTIPOINT时才允许。 |
WSA_FLAG_MULTIPOINT_D_ROOT | 指示创建的套接字将是多点会话中的d_root。 仅当协议的 WSAProtocol_Info 结构中指示了根数据平面时,才允许。 |
WSA_FLAG_MULTIPOINT_D_LEAF | 指示创建的套接字将是多点会话中的d_leaf。 仅当协议的 WSAProtocol_Info结构中 指示XP1_SUPPORT_MULTIPOINT时才允许。 |
注意
对于多点套接字,必须指定一个WSA_FLAG_MULTIPOINT_C_ROOT或WSA_FLAG_MULTIPOINT_C_LEAF,并且必须指定WSA_FLAG_MULTIPOINT_D_ROOT或WSA_FLAG_MULTIPOINT_D_LEAF之一。 有关其他信息,请参阅 SPI 中的与协议无关的多播和多点 。
面向连接的套接字(如 SOCK_STREAM)提供全双工连接,并且必须处于连接状态,然后才能发送或接收任何数据。 使用 LPWSPConnect 调用创建到另一个套接字的连接。 连接后,可以使用 LPWSPSend 和 LPWSPRecv 调用传输数据。 会话完成后,必须执行 LPWSPCloseSocket 。
用于实现面向连接的可靠套接字的通信协议可确保数据不会丢失或重复。 如果对等协议具有缓冲区空间的数据无法在合理的时间内成功传输,则认为连接断开,后续调用将失败,错误代码设置为 WSAETIMEDOUT。
无连接、面向消息的套接字允许使用 LPWSPSendTo 和 LPWSPRecvFrom 向任意对等方发送和接收数据报。 如果此类套接字使用 LPWSPConnect 连接到特定对等方,则可以使用 LPWSPSend 将数据报发送到该对等方,并且只能从使用 LPWSPRecv) 此对等方 (接收数据报。
不需要支持 SOCK RAW 类型的套接字,但建议服务提供商支持原始套接字,只要这样做有意义。
分层服务提供程序提供此函数的实现,但在调用协议链中下一层的 LPWSPSocket 时,它也是此函数的客户端。 一些特殊注意事项适用于此函数的 lpProtocolInfo 参数,因为它通过协议链的层向下传播。
如果协议链中的下一层是另一层,则在调用下一层的 LPWSPSocket 时,此层必须向下一层传递一个 lpProtocolInfo,该 lpProtocolInfo 引用具有相同未修改链信息的相同未修改 WSAProtocol_Info 结构。 但是,如果下一层是基本协议 (即链) 中的最后一个元素,则此层在调用基提供程序的 LPWSPSocket 时执行替换。 在这种情况下,lpProtocolInfo 参数应引用基提供程序的WSAPROTOCOL_INFO结构。
此策略的一个重要好处是基础服务提供商不必了解协议链。
当通过其他函数(如 LPWSPAddressToString、LPWSPDuplicateSocket、WSPStartup 或 LPWSPStringToAddress)的分层序列传播WSAProtocol_Info结构时,此传播策略适用。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | ws2spi.h |