gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:58 25 4
gpt4 key购买 nike

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

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

有什么想法或想法吗?

谢谢,

最佳答案

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

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

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

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

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

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

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

关于c++ - 将已建立的 TCP 连接从一个进程移交给另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18365180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com