我们使用Android设备作为PC控制的工业过程的遥控器。
有时连接可能会意外中断 - 电池耗尽,Android设备超出范围,网络问题,无线接入点重置,Android重新启动等等。在这种情况下,PC可能无法“知道”它已断开连接,因为它永远不会获得FIN。
所以当我在Android端重新启动时,我正在初始化套接字我做了
sock = new Socket(ipAddress, portNumber);
在网络嗅探器(Wireshark)上,我可以看到Android发送了一个SYN。但是因为PC不知道它已断开连接,即它认为它仍然从之前连接,它发送RST,ACK。这导致Android Socket构造函数返回null。
我需要做的是将FIN而不是SYN发送到PC。但我认为SYN必须是握手中的第一个数据包(我不一个网络专家)。或者,不要以SYN开头,所以我可以开始重新使用连接,就像没有发生任何事情一样。有没有办法做到这一点?如何从Android端打破这种僵局? (我无法控制PC的功能)
提前致谢。
答案 0 :(得分:1)
这是TCP握手方案工作方式的基本结果。这不是你可以从远程端修复的东西(不破坏TCP的规则),而是每个端部必须自己决定它将如何处理事物的东西。
在服务器端,您可以使用服务器套接字上的重用设置来解决它,并配置超时以及可能限制操作系统中的关闭等待套接字的数量。
在客户端,您需要决定在什么时候放弃另一端的存在并重新开始。这可能意味着您将不得不修改PC的行为,因为当前的客户端程序似乎没有逻辑来处理可预期的网络连接丢失情况。