The WSARecvMsg
功能如所描述here 要求您检索指向它的函数指针,如以下引用所示:
注意 必须在运行时通过指定 SIO_GET_EXTENSION_FUNCTION_POINTER 操作码调用 WSAIoctl 函数来获取 WSARecvMsg 函数的函数指针。
这有什么具体原因吗?在使用这个函数时,我打算在启动时检索函数指针,然后从那时起一致地使用它。这种做法有什么问题吗?函数是否会发生任何变化,这意味着我们需要重新获取此指针,我们如何知道是否是这种情况?
Per the WSARecvMsg()文档:
注意该函数是一个Microsoft 特定扩展符合 Windows 套接字规范
Per the WSAIoctrl()文档:
SIO_GET_EXTENSION_FUNCTION_POINTER(操作码设置:O、I、T==1)
检索指向关联服务提供者支持的指定扩展函数的指针。输入缓冲区包含一个全局唯一标识符(GUID),其值标识所讨论的扩展函数。指向所需函数的指针将返回到输出缓冲区中。扩展功能标识符由服务提供商供应商建立,并应包含在描述扩展功能功能和语义的供应商文档中。
在大多数系统上,Microsoft 的提供程序是唯一安装的提供程序。然而,第 3 方提供商确实存在(自定义 TCP 堆栈等)并且也可以安装。根据WSADATA的文档WSAStartup()
:
Windows Sockets 的架构在版本 2 中发生了变化,以支持多个提供商,并且 WSADATA 不再适用于单个供应商的堆栈。
这得到了进一步支持:
Windows Sockets 2 架构
特定于提供商的扩展机制
当您使用创建套接字时socket()
,您无法控制使用哪个提供程序。当您使用创建套接字时WSASocket()
相反,你可以可选地通过指定特定的提供者lpProtocolInfo
范围。
WSARecvMsg()
仅在 Microsoft 的提供程序中可用,因此您必须将其传递给SOCKET
与同一提供者相关联。WSAIoctrl()
可用于向提供者发送命令SOCKET
属于。所以,通过使用SIO_GET_EXTENSION_FUNCTION_POINTER
,您确保WSARecvMsg()
(或任何其他特定于供应商的功能)由指定的提供者支持SOCKET
因此与此兼容SOCKET
.
The other Microsoft-specific functions that are provided by Microsoft's provider via WSAIoctrl()
1 are:
AcceptEx()
ConnectEx()
DisconnectEx()
GetAcceptExSockAddrs()
TransmitFile()
TransmitPackets()
WSASendMsg()
一旦您检索了指向特定于供应商的函数的指针,只要提供程序保持加载在内存中(在第一次调用之间),您就可以尽可能多地重用该指针WSAStartup()
最后一次致电WSACleanup()
)然后你通过它SOCKET
属于该提供商。
1: Per Provider-Specific Extension Mechanism
在 Windows Vista 及更高版本上,新的Winsock系统扩展直接从Winsock DLL导出,因此不需要WSAIoctl函数来加载这些扩展。 Windows Vista 及更高版本中提供的新扩展功能包括WSAPoll
and WSASendMsg
从 Ws2_32.dll 导出的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)