C++ 应用程序:是不是可以将接受的 TCP 连接从一个进程传递到另一个进程?

Posted

技术标签:

【中文标题】C++ 应用程序:是不是可以将接受的 TCP 连接从一个进程传递到另一个进程?【英文标题】:C++ application: Is it possible to pass accepted TCP connection from one process to another?C++ 应用程序:是否可以将接受的 TCP 连接从一个进程传递到另一个进程? 【发布时间】:2011-03-15 13:54:09 【问题描述】:

所以我想知道 - 是否可以将接受的 TCP 连接(在 Windows 或 Unix 等操作系统上)从一个进程传递到另一个进程?这里的重点是传递连接——而不是像代理应用那样传递数据。

【问题讨论】:

【参考方案1】:

在 Unix 中,TCP 连接表示为套接字文件描述符。当你fork一个进程时,文件描述符被子进程继承,包括TCP套接字。 (尽管如果给定带有fcntlFD_CLOEXEC 标志,它们可能会在exec 上关闭。)

也可以使用本地(Unix)域套接字在不相关的进程之间传输文件描述符;见this question。

我不确定 Windows。

【讨论】:

这是什么意思?两个进程将共享相同的连接? @Andrey:是的,所以他们必须协调他们对连接的访问​​。 @Andry - 套接字只是一个文件描述符。一旦你accept() 一个连接,你就可以对它做任何你想做的事情,包括将它发送到另一个本地进程。 套接字不是 Windows 上的文件描述符。【参考方案2】:

在Windows上,使用WSADuplicateSocket,将填好的WSAPROTOCOL_INFO传递给其他进程,使用WSPSocket重新创建一个socket。

在类 unix 操作系统上,这可以使用sendmsg() 系统调用来实现。 libancillary 为你抽象了这个。

【讨论】:

有没有类似 libancillary for windows 的库?是否有任何关于如何在 Windows 上执行此类操作的代码示例/示例? 不知道任何库 - 我唯一一次必须这样做,我只是从头开始编写它。见msdn.microsoft.com/en-us/library/ms740478%28v=vs.85%29.aspx 所以.. 我尝试使用 Boost.ASIO 和 Windows WSADuplicateSocket 创建一个示例... 目前至少在一个进程内***.com/questions/5326564/… 可能你可以看看并提供任何帮助?请)

以上是关于C++ 应用程序:是不是可以将接受的 TCP 连接从一个进程传递到另一个进程?的主要内容,如果未能解决你的问题,请参考以下文章

Docker:服务器是不是在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?

服务器是不是在主机“localhost”(127.0.0.1) 上运行并接受端口 5432 上的 TCP/IP 连接?

C++之TCP三次握手(笔记)

MySQL 服务器不接受远程连接

如何创建将侦听特定端口并接受 TCP 连接(非 https)的 servlet

tcp客户端socket