首页 文章

如何判断我是否仍在使用Android中的套接字进行监听

提问于
浏览
7

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

这种架构可以很好地发送和接收,但是如果没有 exactly 1 minute 的流量,那么如果PC尝试向Android发送数据包,它会返回RST,就像Android不再收听一样 . PC端的Winsock正在解释这是暂停 .

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

(Edit) 我特指的是Android是否为 listening . 1分钟后,Android设备仍然可以 send . 这是一个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 .

Edit 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

    您必须通信设备 .

    • Android设备

    • 和PC

    您的Android设备正在发送RST标志,这意味着,在已寻址的端口上没有可用的服务 .

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

    create your own TCP Datagram by implementing a raw socket interface .

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

    这是more infos hier

    希望我能帮忙

相关问题