为什么将WSARecvMsg函数实现为函数指针并且可以重用此指针?

Fan*_*Fox 2 c++ sockets windows

此处WSARecvMsg描述的函数要求您检索指向它的函数指针,如以下引用所示:

注意必须在运行时通过使用指定的SIO_GET_EXTENSION_FUNCTION_POINTER操作码调用WSAIoctl函数来获取WSARecvMsg函数的函数指针.

这有什么特别的原因吗? 在使用这个函数时,我打算在启动时检索函数指针,然后从那时开始一直使用它.这种方法有什么问题吗?关于函数的任何改变都意味着我们需要重新获取这个指针,我们怎么知道是不是这样呢?

Rem*_*eau 14

根据WSARecvMsg()文件:

注意此函数是Windows套接字规范的Microsoft特定扩展

根据WSAIoctrl()文件:

SIO_GET_EXTENSION_FUNCTION_POINTER(操作码设置:O,I,T == 1)
检索指向相关服务提供者支持的指定扩展函数的指针.输入缓冲区包含全局唯一标识符(GUID),其值标识所讨论的扩展函数.指向所需函数的指针在输出缓冲区中返回.扩展功能标识符由服务提供商供应商建立,应包含在描述扩展功能和语义的供应商文档中.

在大多数系统上,Microsoft的提供商是唯一安装的提供商.但是,第三方提供商确实存在(自定义TCP堆栈等),也可以安装.根据以下 WSADATA文档WSAStartup():

Windows套接字的体系结构在版本2中更改为支持多个提供程序,WSADATA不再适用于单个供应商的堆栈.

哪个进一步支持:

Windows套接字2体系结构

特定于提供者的扩展机制

使用时创建套接字时socket(),您无法控制使用哪个提供程序.使用WSASocket()替代方法创建套接字时,可以选择通过lpProtocolInfo参数指定特定的提供程序.

WSARecvMsg()仅在Microsoft的提供程序中可用,因此您必须将其传递给与SOCKET同一提供程序关联的服务器. WSAIoctrl()可用于向命令SOCKET所属的提供程序发送命令.因此,通过使用SIO_GET_EXTENSION_FUNCTION_POINTER,您可以确保WSARecvMsg()指定的提供程序支持(或任何其他特定于供应商的功能)SOCKET,从而与之兼容SOCKET.

Microsoft提供商通过WSAIoctrl()1提供的其他Microsoft特定功能包括:

  • AcceptEx()
  • ConnectEx()
  • DisconnectEx()
  • GetAcceptExSockAddrs()
  • TransmitFile()
  • TransmitPackets()
  • WSASendMsg()

一旦检索指向一个特定供应商的功能,你可以重复使用指针,就像你的供应商保持在内存中加载(第一次调用之间要长WSAStartup(),并在最后一次通话WSACleanup()),并会传递给它SOCKET的是属于该提供者.

1:每个特定于提供商的扩展机制

在Windows Vista及更高版本中,新的Winsock系统扩展直接从Winsock DLL导出,因此不需要WSAIoctl函数来加载这些扩展.在Windows Vista和更高版本中提供的新的扩展功能,包括WSAPollWSASendMsg那都从ws2_32.dll导出的函数.

  • 该死的,这是一个很好的答案,我希望我能再次投票. (2认同)