我开发了一个基于套接字的客户端/服务器应用程序。
客户端在Delphi中。服务器端在IBM I (as400)上
有时,客户机和服务器断开连接。我不太确定为什么,但我认为这是因为它们之间的一台机器(代理,路由器,防火墙)发送了一个RST
数据包。
无论如何,我正在尝试重新连接客户端与服务器上的相同进程。(不是另一个,相同的,这很重要)。
为此,我从客户机创建一个新连接。服务器上有两个进程。我将它们命名为"LostProcess"one_answers"HelperProcess"。
LostProcess正在等待数据队列中的数据。
客户端告诉HelperProcess它已经连接到LostProcess。
HelperProcess发送数据给LostProcess(通过数据队列)。
HelperProcess创建一个giveDescriptor, LostProcess创建一个takeDescriptor。
然后HelperProcess停止,LostProcess向客户端发送数据(表示"I'm back")。
到目前为止,它是有效的,但是当客户端发送数据时,LostProcess(我们现在可以称之为RebornProcess)永远不会接收到它们(我试图不停止HelperProcess,并且他是接收数据的人)。
使用Wireshark,我可以看到客户端使用不同的本地端口发送数据,所以我想这就是为什么RebornProcess没有接收它们的原因。
我试图强制新的客户端套接字的本地端口与第一个端口相同,但是新的客户端套接字无法连接一段时间,如果我等待的时间足够长,我就会遇到与以前相同的问题。
有人知道如何使重新连接工作吗?
你所做的通常是不可能的。一旦TCP连接丢失,它就永远消失了。两个应用程序必须为丢失的连接关闭各自的套接字,客户端应用程序必须创建一个新的套接字连接以继续与服务器交换数据。
如果客户端应用程序希望通过bind()
重用相同的本地端口(这在大多数情况下通常是不可取的),但不想等待操作系统先释放端口,那么客户端可以在调用bind()
和connect()
之前通过setsockopt()
在新的套接字上启用SO_REUSEADDR
选项。
我很确定答案是你不能。
如果TCP/IP允许新连接重新连接到现有进程连接,将会出现各种安全问题。
您应该终止丢失的进程,并使用新进程代替。