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