2017-05-18 77 views
7

我对Android设备上的某些代码负责,该代码通过无线接入点(WAP)通过WiFi与PC通信,使用TCP发送数据包并且。在PC端,软件使用winsock发送和接收Android设备的数据包,但我无法访问或控制此连接的PC端。如何判断我是否还在Android上侦听套接字

这种架构工作正常发送和接收,但如果有一个正是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运= 8170长度= 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]

也N.B.这只是指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()); 
+0

我想添加一些代码来告诉你如何创建TCP连接(以怎样的配置)在Android方面可能会有所帮助,为您提供一个有意义的答案。 – SergGr

+0

好吧,我已经添加了它,但我不确定它是如何帮助的,因为它只是一个通用的套接字。这个问题实际上是关于如何在Android中告诉我是否正在收听,或者如果我已经停止收听,可以通知我。 – user316117

+0

只是FYI我想你实际上是想确定套接字是否仍然*连接*,而不是如果它正在侦听*。它们是两个不同的东西,并且听或不听的问题与你的问题没有任何关系。 – alzee

回答

0

你必须通信设备。

  • Android设备
  • 和PC

您的Android设备发送一个RST标志,这意味着,没有在解决端口提供服务。

编程,以检测这种FLAG分别不可用的服务,

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

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

Here's more infos hier

希望我能帮助

+0

您链接的示例似乎假定在Linux根级别进行直接编程。但是,这是股票Android,而不是根植设备,我没有对PC的编程访问权限,所以我只能访问我可以从** Android API **中看到的内容,正如我在原始问题中所解释的。所以我不确定你的回答与我的问题有关。这真的是一个非常简单的** Android编程问题** - 我如何得到Android端口或套接字状态变化的通知? – user316117

相关问题