【问题标题】:Android Socket Lockup with PC - PC thinks we're still connected, Android doesn'tAndroid Socket Lockup with PC - PC 认为我们仍然连接,Android 没有
【发布时间】:2013-05-17 14:19:27
【问题描述】:

我们将 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 的功能)

提前致谢。

【问题讨论】:

    标签: android tcp


    【解决方案1】:

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

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

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

    【讨论】:

    • 当您说“客户端”时,您指的是 Android 还是 PC? (我认为客户端是 Android,PC 是服务器)你是说我在 Android 端对这个锁定无能为力吗?
    • 服务器是维护监听套接字的人,客户端是连接到它的人。是的,我的意思是,无论哪一方遇到问题,您都必须解决问题。听起来您被要求与一个程序进行交互,该程序的编写者还没有经验来实现它必须在有线互联网上处理的各种条件,更不用说移动设备了。
    • PC 是监听器。我很困惑,因为您说“当前的客户端程序是在没有逻辑的情况下编写的,无法处理预期的网络连接丢失情况”我仍然不确定您所说的“无论哪一方正在经历它”是什么意思——它是 Android(客户端) 正在经历 RST,但目前还不清楚 Android 方面可以做什么。
    • 锁定问题必须在遇到它的任何一方进行修复。如果 PC 充当服务器,您可以尝试用 netcat(获取带有侦听支持的版本)替换当前程序,看看是否可以成功重新连接到该程序。这是一个古老的来源,但它确实展示了如何设置一个监听套接字,在网络丢失后可以重新连接,但是如果这些事件频繁发生,还需要操作系统配置。
    • “锁定问题必须在遇到它的任何一方解决。”我仍然无法解析您所说的“体验它”是什么意思。 PC“体验”SYN,Android“体验”RST,结果相互僵持。我最初的问题是:在 Android 端有什么可以做圆顶的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多