Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+的在线更新机制+;服务器应用程序_C++_Hotswap - Fatal编程技术网

C++ c+的在线更新机制+;服务器应用程序

C++ c+的在线更新机制+;服务器应用程序,c++,hotswap,C++,Hotswap,找不到有关此主题的任何内容 我有一个Windows TCP C++服务器应用程序,我想不时更新。 显然,您知道这会带来一个问题-从用户的角度来看,服务器应该是全天候的。 更新时,还需要保持与用户的当前TCP连接 我一直在考虑类似模块的系统,例如套接字处理模块将驻留在“sockets.dll”中,服务器的逻辑将驻留在“logic.dll”中。 采用这种方法似乎打开了潘多拉的盒子 -我将如何进行模块的实际“交换”?想象一下,X工作者线程不断地从一个模块向另一个模块发送数据——交换时,我需要一种(

找不到有关此主题的任何内容

<>我有一个Windows TCP C++服务器应用程序,我想不时更新。
显然,您知道这会带来一个问题-从用户的角度来看,服务器应该是全天候的。
更新时,还需要保持与用户的当前TCP连接


我一直在考虑类似模块的系统,例如套接字处理模块将驻留在“sockets.dll”中,服务器的逻辑将驻留在“logic.dll”中。
采用这种方法似乎打开了潘多拉的盒子
-我将如何进行模块的实际“交换”?想象一下,X工作者线程不断地从一个模块向另一个模块发送数据——交换时,我需要一种(轻松快速)的方式来停止/暂停它们;可能是信号吗?
-更新时,协议版本甚至函数签名可能会更改。如何处理这个问题?
-其他问题,如未被注意到的逻辑错误。
-谁知道还会出现什么样的问题呢


除上述问题外,我还担心如何更新10台服务器?我的意思是,他们都互相联系,互相交流。
如果更新引入了一个协议修改,它可能会导致巨大的问题,在这种情况下,我需要整体更新整个集群(服务器);停止整个行动?这听起来根本不对!我该怎么做?我在这里遗漏了哪些概念,如何学习这些概念


我能做些什么吗?
你会怎么做?你做过这样的事吗?
你知道解决这个问题的任何机制/文章/项目/源代码示例/等等吗

任何有价值的建议都是非常宝贵的

这里有一个想法:

  • 旧版本下载更新并启动它

  • 旧版本通过将新连接转发到更新版本(在其他端口侦听)来停止接受新连接
  • 旧版本在完成连接后关闭
  • 新版本检测旧版本何时退出并切换端口
基本上,我们的想法是让两个版本同时运行。

这里有一个想法:

  • 旧版本下载更新并启动它

  • 旧版本通过将新连接转发到更新版本(在其他端口侦听)来停止接受新连接
  • 旧版本在完成连接后关闭
  • 新版本检测旧版本何时退出并切换端口

基本上,我们的想法是让两个版本同时运行。

在协议更改方面,我建议您对协议进行版本更改。在参与服务器之间的连接开始时,让发起方或接收方(我认为哪一方并不重要)宣布它所理解的协议的最新版本,然后另一方以实物形式作出响应。他们回到了他们都能理解的最新版本

是的,这意味着要在一段时间内维护两个协议版本的代码,但一旦知道所有服务器都已更新并使用新协议,就可以停用旧代码


假设您还可以控制所有可能的客户端软件,那么您也可以对客户端执行同样的操作。当然,如果您无法控制用户何时升级,这可能需要更长时间维护旧协议代码。

关于协议更改,我建议您对协议进行版本设置。在参与服务器之间的连接开始时,让发起方或接收方(我认为哪一方并不重要)宣布它所理解的协议的最新版本,然后另一方以实物形式作出响应。他们回到了他们都能理解的最新版本

是的,这意味着要在一段时间内维护两个协议版本的代码,但一旦知道所有服务器都已更新并使用新协议,就可以停用旧代码


假设您还可以控制所有可能的客户端软件,那么您也可以对客户端执行同样的操作。当然,如果您无法控制用户何时升级,这可能需要延长旧协议代码的维护时间。

“旧版本通过将新连接转发到更新版本(在不同端口上侦听)来停止接受新连接。”。。。我认为你不需要这样做。在新版本启动并运行时,旧版本可以简单地关闭其侦听器套接字(假定为BSD样式的套接字堆栈),而无需关闭其活动连接。然后,新版本可以开始侦听同一端口上的连接。不需要转发或多个端口。@Mike:但是OP指定了一个操作系统:Windows。Windows是BSD样式的堆栈。@George:1)我想让我的评论更一般一些。2) @Andrew说了些什么,但由于没有在Windows上开发,我不知道微软保留了多少BSD。无论如何,这里的关键函数是
listen()
accept()
listen()
与侦听套接字一起使用,当您想停止侦听端口时,您可以关闭侦听套接字,
accept()
必须为您提供一个具有实际连接的新套接字,而不仅仅是重复使用提供的侦听器套接字。感谢大家在此分享想法!我想确认:可以关闭接受端口,但仍可以保持与已连接端口(通过该端口接受)的通信。无论如何,我认为这只解决了问题的一小部分。“旧版本通过将新连接转发到更新版本(在不同端口上侦听)来停止接受新连接。”。。。我认为你不需要这样做。在新版本启动并运行时,旧版本可以简单地关闭其侦听器套接字(假定为BSD样式的套接字堆栈),而无需关闭其活动连接。然后是新的v