将已建立的TCP连接从一个进程移交给另一个进程

时间:2013-08-21 18:38:14

标签: c++ linux network-programming

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

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

任何想法或想法?

谢谢,

1 个答案:

答案 0 :(得分:2)

我真的不知道这是否可能,但我认为不是。如果你fork()那么孩子将“继承”描述符,但我不知道他们是否表现得像应该(虽然我怀疑他们这样做。)并且通过分叉,你无法运行新的代码(你可以吗?)简单的描述符编号是特定于进程的,所以只是将它们传递给一个新的,不相关的进程也不会工作,并且当你的进程终止时它们将被关闭。

一种解决方案(在没有更简单的解决方案的情况下)是将服务器分成两个进程:

  1. 前端:一个非常的简单流程,只接受连接,保持打开并将收到的所有数据转发给第二个流程,反之亦然。< / LI>
  2. 服务器:真正的网络服务器,完成所有逻辑和处理,但直接与客户沟通。
  3. 第一个和第二个进程通过简单的协议进行通信。该协议的一个特点是它必须支持终止和重新启动第二个进程。

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

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

    正如我所说,这是一个解决方案,只有在找不到更简单和更简单的情况下,您才可以尝试