恢复相同的TCP连接

恢复相同的TCP连接,tcp,connection,Tcp,Connection,我有一个多进程TCPServer,它(在linux上通过fork()为每个客户端的请求创建)一个进程(子进程),同时它正在侦听其他连接的请求。所以我在客户端和服务器之间有一个1对1的映射。 假设一个客户端崩溃……是否可以将其重新连接到同一子服务器进程?换句话说……是否可以恢复失败的预显示连接,或者重新连接的尝试是否可以创建新连接(然后是新的子服务器进程)?谢谢您……在(forker)不了解(forkee)内部会话相关细节的情况下,您必须假设外部细节足以确定哪些远程连接与哪些本地连接端点重新关联

我有一个多进程TCPServer,它(在linux上通过fork()为每个客户端的请求创建)一个进程(子进程),同时它正在侦听其他连接的请求。所以我在客户端和服务器之间有一个1对1的映射。 假设一个客户端崩溃……是否可以将其重新连接到同一子服务器进程?换句话说……是否可以恢复失败的预显示连接,或者重新连接的尝试是否可以创建新连接(然后是新的子服务器进程)?谢谢您……

在(forker)不了解(forkee)内部会话相关细节的情况下,您必须假设外部细节足以确定哪些远程连接与哪些本地连接端点重新关联

不过,您可以更改应用程序中的工作方式。Oracle SQL*Net在某些平台上执行此操作(由于平台限制)


与TCPServer的初始连接会导致一个fork
,然后打开一个新的侦听套接字
,发回一个重定向指令以连接到新的侦听套接字并识别详细信息(以避免其他人连接和模拟原始连接器)。然后,客户端连接到新的套接字,并使用此套接字在断开连接之前进行任何重新连接。

我在.NET平台中做了类似的事情。如果您有对每个连接都唯一的东西(例如连接设备的IMEI),那么您应该有一个全局二维数组变量,并结合ProcessID和IMEI。因此,当设备断开连接,然后设备重新连接时,您只能在此阵列中搜索此IMEI,并且您拥有此设备的流程。您应该非常小心使用这个全局变量

编辑: 我给出了一个唯一标识符的示例。在我的例子中,这就是设备的IMEI。在你的情况下,这可能是其他你知道它是独一无二的东西。
我不得不这样做,因为我在设备断开连接时遇到了很大的问题。每一个新设备都是新的连接,所以后来我的CPU使用率非常高

坦克你们的快速反应…我的代码是在C++和这个语言是强制性的…所以我必须找到一个解决方案在这方面……@斯特凡你是什么意思IMEI?我明白这是一个UNIVIQUE的连接标识符…但是你能给我更多的细节吗?好吧,我明白…所以,纠正我,如果我…对于每一个新连接的到来,我必须先控制它是来自以前连接的客户机还是新客户机。在第一种情况下,我必须将套接字描述符传递给上一个服务器子进程?它足以像什么都不发生一样恢复连接吗?我不会传递给上一个进程,我宁愿关闭旧进程。。。如果你已经接受了新的连接,那么你就有了一个新的流程(在我的例子中就是这样)。因此,当您有一个新连接(在新进程中接受)时,您将在数组中搜索ID。如果您拥有该ID,则终止该进程,并将新进程与ID@Stefan我可以建议您编辑一个答案,并将两个答案合并为一个,删除另一个吗?这让你更容易端到端地理解你的答案:)@Stefan:首先,谢谢你的回答。但是有些事情我不明白。你说每个新客户机的连接都以一个大的CPU使用率结束。但是如果你在一个新的进程中接受一个新的连接,你如何避免这种情况呢?关于上一个连接,你传递了哪些数据?我不是说每个新客户机的连接都以一个大的CPU结束用法。我的意思是,在n个连接之后,如果没有解决断开设备的机制,您的进程将使用大量资源(每个连接都是一个线程)。这就是为什么您应该找到不再使用的连接(线程)。在我的例子中,连接中断后,设备再次连接。因此,在重新建立新连接时,我在数组中搜索另一个具有相同标识号的线程。如果存在,我将处理该线程。