WSADuplicateSocketA 函数 (winsock2.h)
WSADuplicateSocket 函数返回一个WSAPROTOCOL_INFO结构,该结构可用于为共享套接字创建新的套接字描述符。 WSADuplicateSocket 函数不能在启用了 QOS 的套接字上使用。
语法
int WSAAPI WSADuplicateSocketA(
[in] SOCKET s,
[in] DWORD dwProcessId,
[out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);
参数
[in] s
标识本地套接字的描述符。
[in] dwProcessId
将使用重复套接字的目标进程的进程标识符。
[out] lpProtocolInfo
指向由客户端分配的缓冲区的指针,该缓冲区的大小足以包含 WSAPROTOCOL_INFO 结构。 服务提供商将协议信息结构内容复制到此缓冲区。
返回值
如果未发生错误, 则 WSADuplicateSocket 返回零。 否则,将返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。
错误代码 | 含义 |
---|---|
在使用此函数之前,必须成功调用 WSAStartup 。 | |
网络子系统失败。 | |
:指示指定参数之一无效。 | |
阻止 Windows Sockets 1.1 调用正在进行,或者服务提供程序仍在处理回调函数。 | |
无法提供更多套接字描述符。 | |
未提供任何缓冲区空间。 无法创建套接字。 | |
:描述符不是套接字。 | |
lpProtocolInfo 参数不是用户地址空间的有效部分。 |
注解
WSADuplicateSocket 函数用于在进程之间启用套接字共享。 源进程调用 WSADuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构。 它使用一些进程间通信 (IPC) 机制将此结构的内容传递给目标进程,而目标进程又在对 WSASocket 的调用中使用它来获取重复套接字的描述符。 特殊 WSAPROTOCOL_INFO 结构只能由目标进程使用一次。
套接字可以在给定进程中的线程之间共享,而无需使用 WSADuplicateSocket 函数,因为套接字描述符在进程的所有线程中都有效。
下表说明了建立和移交共享套接字的一种可能方案。
源进程 | IPC | 目标进程 |
---|---|---|
1) WSASocket、 WSAConnect | ||
2) 请求目标进程标识符 | ==> | |
3) 接收进程标识符请求并响应 | ||
4) 接收进程标识符 | <== | |
5) 调用 WSADuplicateSocket 以获取特殊的 WSAPROTOCOL_INFO 结构 | ||
6) 将 WSAPROTOCOL_INFO 结构发送到目标 | ||
==> | 7) 接收 WSAPROTOCOL_INFO 结构 | |
8) 调用 WSASocket 以创建共享套接字描述符。 | ||
9) 使用共享套接字进行数据交换 | ||
10) 关闭 | <== |
引用共享套接字的描述符可以单独用于 I/O。 但是,Windows 套接字接口不实现任何类型的访问控制,因此由所涉及的进程来协调其在共享套接字上的操作。 共享套接字通常用于拥有一个负责创建套接字和建立连接的进程,以及负责信息交换的其他进程。
与套接字关联的所有状态信息在所有描述符中都是通用的,因为套接字描述符是重复的,而不是实际的套接字。 例如,使用一个描述符执行的 setsockopt 操作随后使用任何或所有描述符的 getsockopt 可见。 源进程和目标进程应将相同的标志传递给各自的 WSASocket 函数调用。 如果源进程使用 套接字 函数创建套接字,则目标进程必须将 WSA_FLAG_OVERLAPPED 标志传递给其 WSASocket 函数调用。 进程可以在重复的套接字上调用 closesocket ,描述符将解除分配。 但是,基础套接字将保持打开状态,直到最后一个剩余的描述符调用 closesocket 。
共享套接字上的通知受 WSAsyncSelect 和 WSAEventSelect 的常见约束约束。 使用任何共享描述符发出上述任一调用都会取消套接字之前的任何事件注册,而不管使用哪个描述符进行该注册。 因此,共享套接字无法将FD_READ事件传送到处理 A,FD_WRITE事件来处理 B。对于需要这种紧密协调的情况,建议开发人员使用线程而不是单独的进程。
Windows 8.1 和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本上的 Windows 应用商店应用支持 WSADuplicateSocketW 函数。
注意
winsock2.h 标头将 WSADuplicateSocket 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
最低受支持的客户端 | Windows 8.1、Windows Vista [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | winsock2.h |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |