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 套接字 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) closesocket | <== |
引用共享套接字的描述符可以单独用于 I/O。 但是,Windows 套接字接口不实现任何类型的访问控制,因此由所涉及的进程来协调其在共享套接字上的操作。 共享套接字通常用于有一个负责创建套接字和建立连接的进程,以及负责信息交换的其他进程。
与套接字关联的所有状态信息在所有描述符中都是通用的,因为套接字描述符是重复的,而不是实际的套接字。 例如,使用一个描述符执行的 setsockopt 操作随后使用任何或所有描述符 获取ockopt 可见。 源进程和目标进程应将相同的标志传递给各自的 WSASocket 函数调用。 如果源进程使用 套接字 函数创建套接字,则目标进程必须将 WSA_FLAG_OVERLAPPED 标志传递给其 WSASocket 函数调用。 进程可以在重复套接字上调用 closesocket,描述符将解除分配。 但是,基础套接字将保持打开状态,直到最后一个剩余描述符调用 closesocket。
有关共享套接字的通知受 WSAAsyncSelect 和 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 应用] |
目标平台 | 窗户 |
标头 | winsock2.h |
库 | Ws2_32.lib |
DLL | Ws2_32.dll |