如何判断我是否还在Android上的套接字上进行监听?

时间:2017-05-18 16:03:24

标签: android tcp-ip

我负责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]

也是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());

1 个答案:

答案 0 :(得分:0)

您必须通信设备。

  • Android设备
  • 和PC

您的Android设备正在发送RST标志,这表示在已寻址的端口上没有可用的服务。

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

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

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

这是more infos hier

希望我能帮忙