1

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

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

有什么想法或想法吗?

谢谢,

4

1 回答 1

2

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

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

  1. 前端:一个非常简单的进程,它只接受连接,保持它们打开并将接收到的任何数据转发给第二个进程,反之亦然。
  2. 服务器:真正的 Web 服务器,它执行所有逻辑和处理,但不直接与客户端通信。

第一和第二进程通过简单的协议进行通信。该协议的一个特性必须是它确实支持被终止和重新启动的第二个进程。

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

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

正如我所说,这是一个只有在没有找到更简单和更简单的方法时才可以尝试的解决方案。

于 2013-08-21T19:16:57.237 回答