在不相关的进程之间复制 Windows 套接字

Posted

技术标签:

【中文标题】在不相关的进程之间复制 Windows 套接字【英文标题】:Duplicate Windows sockets between unrelated processes 【发布时间】:2022-01-18 22:09:38 【问题描述】:

我在我的学习项目中使用 C 和 Winsock2。

我有一些问题希望有人能确认。

假设我有 2 个不相关的进程,进程 A 和进程 B(不使用 CreateProcess)。所谓不相关,我的意思是它不是父母和孩子。

1)

如果它们不相关,Windows 中是否可以接受进程 A 中的套接字并将其传递给进程 B?

2)

我想我必须使用WSADuplicateSocket?但这只适用于相关流程?

希望有人能解释并确认上述内容..

【问题讨论】:

当你说“通过那个”时,“那个”是什么? 传递套接字句柄:) Unix 系统支持sending sockets and other file descriptors via AF_UNIX sockets。 Windows now supports AF_UNIX sockets,但我不知道这是否包括在进程之间发送套接字。 我正在重新审视我的一个老问题。我记得 WSADuplicateSocket 仅在进程 A 创建进程 B(如分叉)时才有效.. 所以你是说如果我运行进程 A 和后来的进程 B - 我应该能够在进程 A WSADuplicateSocket 中使用,并使用命名管道将套接字发送到进程 B,即使它们不相关?我只是想确认是否需要 DuplicateHandle.. 【参考方案1】:

如果它们不相关,Windows 中是否可以接受进程 A 中的套接字并将其传递给进程 B?

是的,通过WSADuplicateSocket()

WSADuplicateSocket 函数用于启用进程之间的套接字共享。 源进程调用WSADuplicateSocket 以获得特殊的WSAPROTOCOL_INFO 结构。 它使用一些进程间通信 (IPC) 机制将此结构的内容传递给目标进程,然后目标进程在调用 WSASocket 时使用它来获取复制套接字的描述符。特殊的WSAPROTOCOL_INFO 结构只能被目标进程使用一次。

我想我必须使用 WSADuplicateSocket?

是的。

但这仅适用于相关流程?

没有。只要进程 A 知道进程 B 的进程 ID,它就可以在任意 2 个进程之间正常工作,因为这是 WSADuplicateSocket() 的必需参数。

【讨论】:

快速搜索 WSADuplicateSocket 示例(sockdup)。

以上是关于在不相关的进程之间复制 Windows 套接字的主要内容,如果未能解决你的问题,请参考以下文章

辅助库可以用于在不相关的进程(不是分叉的进程)之间共享接受的连接吗?

在 Windows 服务和窗体应用程序之间使用套接字进行进程间通信

进程之间的套接字传递

sockt套接字编程

在 Linux 中的进程之间传输套接字

Linux-进程间通信: 域套接字