客户端/服务器套接字重新连接

时间:2016-10-20 16:07:16

标签: sockets delphi ibm-midrange

我开发了一个基于套接字的客户端/服务器应用程序。

客户端在Delphi中。服务器端位于IBM I(as400)

有时,客户端和服务器断开连接。我不确定为什么,但我认为这是因为他们之间的机器(代理,路由器,防火墙)发送RST数据包。

无论如何,我正在尝试使用服务器上的相同进程重新连接客户端。 (不是另一个,同样,这很重要)。

为此,我从客户端创建一个新连接。所以,我在服务器上有两个进程。我将它们称为“LostProcess”和“HelperProcess”。

LostProcess正在等待数据队列中的数据。

客户端告诉HelperProcess它已连接到LostProcess。

HelperProcess将数据发送到LostProcess(通过数据队列)。

HelperProcess生成一个giveDescriptor,而LostProcess生成一个takeDescriptor。

然后HelperProcess停止,LostProcess将数据发送到客户端(说“我回来了”)。

到目前为止,它有效,但是当客户端发送数据时,LostProcess(我们现在可以称之为RebornProcess)从不接收它们(我试图不停止HelperProcess,并且他是谁接收数据)。 / p>

使用Wireshark,我可以看到客户端使用不同的本地端口发送数据,所以我猜这就是RebornProcess没有收到它们的原因。

我试图强制新客户端套接字的本地端口与第一个端口相同,但是新的客户端套接字暂时无法连接,如果我等待的时间足够长,我会遇到与以前相同的问题

有人知道如何重新连接吗?

2 个答案:

答案 0 :(得分:1)

您正在做的事情通常是不可能的。一旦TCP连接丢失,它就会永远消失。这两个应用必须关闭各自的套接字才能丢失连接,客户端应用必须创建新的套接字连接才能继续与服务器交换数据。

如果客户端应用程序想要通过bind()重用相同的本地端口(在大多数情况下通常不建议),但是不想等待操作系统首先释放端口,那么客户端可以在调用SO_REUSEADDRsetsockopt()之前,通过新套接字上的bind()启用connect()选项。

答案 1 :(得分:0)

很确定答案是你不能。

如果TCP / IP允许新连接重新连接到现有进程连接,那么会出现各种安全问题。

您应该让丢失的进程终止,而只是使用新进程。