将已建立的TCP连接从一个进程移交给另一个进程 我正在编写一个简单的Web服务器,它用C++处理长时间的连接。但是,我需要不时地重新加载我的web服务器。我想知道是否有一种方法可以将已建立的连接从一个进程移交给另一个进程,以便在重新加载后保留已建立的连接

将已建立的TCP连接从一个进程移交给另一个进程 我正在编写一个简单的Web服务器,它用C++处理长时间的连接。但是,我需要不时地重新加载我的web服务器。我想知道是否有一种方法可以将已建立的连接从一个进程移交给另一个进程,以便在重新加载后保留已建立的连接,c++,linux,network-programming,C++,Linux,Network Programming,仅传递文件描述符就足够了吗?连接状态会发生什么变化? 有没有类似的开源项目做同样的事情 有什么想法或想法吗 谢谢,我真的不知道这是否可能,但我认为不可能。如果您fork(),则子进程将“继承”描述符,但我不知道它们的行为是否像should(尽管我怀疑它们是这样的。)并且使用forking时,您无法运行新代码(可以吗?)简单的描述符编号是特定于进程的,因此仅将它们传递给一个新的、不相关的进程也不起作用,当您的进程终止时,它们将被关闭 一种解决方案(如果没有更简单的解决方案)是将服务器分为两个进程:

仅传递文件描述符就足够了吗?连接状态会发生什么变化? 有没有类似的开源项目做同样的事情

有什么想法或想法吗


谢谢,

我真的不知道这是否可能,但我认为不可能。如果您
fork()
,则子进程将“继承”描述符,但我不知道它们的行为是否像should(尽管我怀疑它们是这样的。)并且使用forking时,您无法运行新代码(可以吗?)简单的描述符编号是特定于进程的,因此仅将它们传递给一个新的、不相关的进程也不起作用,当您的进程终止时,它们将被关闭

一种解决方案(如果没有更简单的解决方案)是将服务器分为两个进程:

  • 前端:一个非常简单的流程,只接受连接,保持连接打开,并将接收到的任何数据转发给第二个流程,反之亦然
  • 服务器:真正的web服务器,负责所有逻辑和处理,但不直接与客户端通信
  • 第一和第二进程通过简单协议进行通信。此协议的一个特性必须是它确实支持终止和重新启动的第二个进程

    现在,您可以在不丢失客户端连接的情况下重新加载实际的服务器进程(因为它们是由前端进程处理的)。而且,由于该前端非常简单,可能只有很少的配置和bug,因此您几乎不需要重新加载它。(我假设您需要重新加载服务器进程,因为它会遇到需要修复的错误,或者您需要更改配置和其他内容。)

    该系统的另一个重要且有用的特性是能够“逐渐”在服务器进程之间进行转换。也就是说,您已经有一个前端和一个正在运行的服务器,但是您决定重新加载服务器。您启动另一个连接到前端的服务器进程(而旧服务器仍在运行和连接),前端进程将所有新的客户端连接转发到新的服务器进程(甚至是来自现有客户端连接的所有新请求)当旧服务器处理完它正在处理的所有请求后,它会优雅而干净地退出


    正如我所说的,只有在没有更简单更简单的方法的情况下,您才可以尝试使用此解决方案。

    您所要做的就是传递文件描述符,但是,在父子进程关系之外执行此操作要困难得多。您是否计划让旧的web服务器启动新的web服务器?是的,可能。我现在不希望有父子进程。仅供参考:连接TCP套接字并分叉(并执行)一个新的子进程正是
    inetd
    守护进程所做的,因此,如果父进程持有套接字,子进程继承它,这是可能的。没错!谢谢你指出这一点。因此,连接的套接字描述符在
    fork
    +
    exec
    中确实存在。因此,OP需要做的就是执行下一个服务器进程(创建父/子关系),并以某种方式告诉它有趣的描述符是什么。@DaveS:你能写一个答案,再详细描述一下吗?我相信这比我的解决方法更合适。谢谢你的回复。不过我想指出,我的web服务器有代理连接(其中web服务器实际上是客户机)。这些连接也应该被移交。我搜索了多一点,看到了send\u fd和recv\u fd。还有一个用于此的包装器库。有什么想法吗?