我如何判断我是不是仍在监听 Android 中的套接字

Posted

技术标签:

【中文标题】我如何判断我是不是仍在监听 Android 中的套接字【英文标题】:How can I tell if I'm still listening on a socket in Android我如何判断我是否仍在监听 Android 中的套接字 【发布时间】:2017-10-18 13:28:25 【问题描述】:

我负责 android 设备上的一些代码,它通过无线接入点 (WAP) 通过 WiFi 与 PC 通信,使用 TCP 来回发送数据包。在 PC 端,软件使用 winsock 与 Android 设备发送和接收数据包,但我无法访问或控制此连接的 PC 端。

这种架构可以正常发送和接收,但如果在 正好 1 分钟内没有流量,那么如果 PC 尝试向 Android 发送数据包,它会返回 RST,就好像Android 不再监听。在 PC 端,Winsock 正在解释这是一个超时。

Android 设备配置为保持 WiFi“始终开启”。我在我的代码中使用了 java.net (Android API 16) 套接字。我是否可以定期检查该套接字,或者我可以收到一个事件以查看我是否已停止收听?

(编辑)我特指Android是否在监听。 1 分钟后,Android 设备仍可以发送。这是一个 Wireshark 跟踪说明了这一点:

11 10.1.2.1 10.1.2.11 TCP 79 42825→181 [PSH, ACK] Seq=1 Ack=1 Win=8170 Len=13 7 12 10.1.2.11 10.1.2.1 TCP 89 181→40574 [PSH, ACK] Seq=1 Ack=14 Win=259 Len=23 13 10.1.2.1 10.1.2.11 TCP 60 40574→181 [RST] Seq=14 Win=0 Len=0

Android 是 10.1.2.1,PC 是 10.1.2.11。在这个例子中,我发起了一个从 Android 到 PC 的发送,它运行得很好。 PC 尝试发送一些内容作为响应,但 Android 发送了 [RST]

另外注意。这仅指 TCP - 如果 PC 在 1 分钟后尝试 ping Android,它仍然会收到响应,但 ping 是 ICMP。

编辑 2

有人想看看我是如何创建套接字的。所以这里是:

new SocketPermission(new String(new StringBuilder(configLGIP).append(":180-")), "connect,accept,listen");            
 // Open a socket to the front end
 Log.d("StartTCP", "attempt IP " + configLGIP);
 try 
    sock = new Socket(configLGIP, 180 + SafeActivity.pdanum);
 

稍后我会...

if (sock != null) try 
    sock.setTcpNoDelay(true); 
    bin = new BufferedInputStream(sock.getInputStream());

【问题讨论】:

我认为添加一些代码来展示您如何在 Android 端创建 TCP 连接(以及使用何种配置)可能有助于为您提供有意义的答案。 好的,我已经添加了它,但我不确定它有什么帮助,因为它只是一个通用的 Socket。真正的问题是,在 Android 中,我如何判断我是否在听,或者如果我停止听了,是否会收到通知。 仅供参考,我认为您实际上想确定套接字是否仍然已连接,而不是正在侦听。它们是两个不同的东西,套接字是否监听与您的问题没有任何关系。 好吧,正如我在 Wireshark 跟踪中显示的那样,我仍然可以发送(这不意味着我们已经连接了吗?),但是当有人向我发送数据包时,他们会得到一个 RST。这就是我要区分的原因。 你可以定时发送数据包,比如keep alive 【参考方案1】:

您必须与设备通信。

安卓设备 和电脑

您的 android 设备正在发送一个 RST 标志,这意味着寻址端口上没有可用的服务。

为了检测这样的 FLAG 和不可用的服务,以编程方式,

通过实现原始套接字接口创建您自己的 TCP 数据报

在这种情况下,您可以分析数据报的标头。实现这样的 Socket 需要管理权限(我认为您在 PC 端拥有)。

这里是more infos hier !

希望能帮到你

【讨论】:

您链接到的示例似乎假设在 Linux 根级别直接编程。但这是普通的 Android,不是根设备,而且我没有对 PC 的编程访问权限,所以我只能访问从 Android API 中看到的内容,正如我在原始问题中解释的那样.所以我不确定你的回答与我的问题有什么关系。这确实是一个非常简单的Android 编程问题 - 如何在 Android 的端口或套接字状态发生变化时收到通知?

以上是关于我如何判断我是不是仍在监听 Android 中的套接字的主要内容,如果未能解决你的问题,请参考以下文章

android:webview中如何监听用户操作记录并获取其记录

Android:如何停止这种音乐?

Android:RadioGroup - 如何配置事件监听器

如何监听Stripe cardElement 的输入事件,判断卡片是不是无效并禁用按钮?

给定一个线程 id,如何确定它是不是仍在 Windows 上运行

Android webview中的js如何监听键盘事件