在不相关的进程之间复制 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 viaAF_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 套接字的主要内容,如果未能解决你的问题,请参考以下文章
辅助库可以用于在不相关的进程(不是分叉的进程)之间共享接受的连接吗?