0

我们将 Android 设备用作由 PC 控制的工业过程的遥控器。

有时连接可能会意外断开——电池没电、Android 设备超出范围、网络问题、无线接入点重置、Android 重新启动等。在这些情况下,PC 可能不“知道”它已断开连接因为它永远不会获得 FIN。

因此,当我在 Android 端重新启动事物并初始化套接字时,我会执行

sock = new Socket(ipAddress, portNumber);

在网络嗅探器(Wireshark)上,我可以看到 Android 发送了一个 SYN。但是因为PC 不知道它已经断开连接,即认为它仍然从以前连接,它发送RST,ACK。这会导致 Android Socket 构造函数返回 null。

我需要做的是向 PC 发送 FIN,而不是 SYN。但我认为 SYN 必须是握手中的第一个数据包(我不是网络专家)。或者,不以 SYN 开头,所以我可以开始重新使用连接,就好像什么都没发生一样。有没有办法做到这一点?如何从 Android 端打破这种僵局?(我无法控制 PC 的功能)

提前致谢。

4

1 回答 1

1

这是 TCP 握手方案工作方式的基本结果。这不是您可以从远程端解决的问题(不违反 TCP 规则),而是每个端都必须自行决定如何处理事情的问题。

在服务器端,您可以通过服务器套接字上的重用设置来解决它,并配置超时以及可能对操作系统中关闭等待套接字的数量进行限制。

在客户端,您需要决定在什么时候放弃另一端的存在并重新开始。这可能意味着您将不得不修改 PC 的行为,因为当前客户端程序的编写似乎没有逻辑来处理预期的网络连接丢失情况。

于 2013-05-17T15:32:55.357 回答