gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:04:01 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

HelperProcess创建一个GiveDescriptor,而LostProcess创建一个takeDescriptor。

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

到目前为止,它是可行的,但是当客户端发送数据时,LostProcess(我们现在可以将其称为RebornProcess)从不接收它们(我试图不停止HelperProcess,而他是接收数据的人)。

使用Wireshark,我可以看到客户端使用其他本地端口发送数据,因此我猜这就是RebornProcess无法接收数据的原因。

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

有人有一个如何使重新连接工作的想法吗?

最佳答案

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

如果客户端应用希望通过bind()重用同一本地端口(通常在大多数情况下不建议使用),但又不想等待操作系统首先释放该端口,则客户端可以通过打开SO_REUSEADDR启用setsockopt()选项调用bind()connect()之前的新套接字。

关于sockets - 客户端/服务器套接字重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40159404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com