2013-05-17 13 views
0

我们正在使用Android设备作为由PC控制的工业过程的遥控器。个人电脑Android套接字锁定 - PC认为我们仍然连接,Android不会

有时连接可能会意外中断 - 电池耗尽,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的功能)

在此先感谢。

回答

1

这是TCP握手方案工作方式的基本结果。这不是你可以从远端修复的东西(没有违反TCP的规则),而是每个端点必须决定它如何处理事情的东西。

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

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

+0

当你说“客户端”是指你的Android还是PC? (我认为客户端是Android,PC是服务器)您是否说过我无法在Android上做这个锁定? – user316117

+0

服务器是谁维护监听套接字,客户端是谁连接到它。是的,我的意思是说你必须在任何一方面都解决问题。听起来好像你已经被要求与一个没有经验的人编写的程序进行交互,以实现它必须在有线互联网上处理的一系列条件,更不用说移动设备了。 –

+0

PC是听众。我很困惑,因为你说“当前的客户端程序没有编写逻辑来处理可能出现的网络连接丢失的情况”我仍然不确定你的意思是“哪一方正在经历它” - 这是Android(客户端)正在经历RST,但目前还不清楚Android方面可以做些什么。 – user316117