我负责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 回答
您必须通信设备 .
Android设备
和PC
您的Android设备正在发送RST标志,这意味着,在已寻址的端口上没有可用的服务 .
以编程方式为了检测此类FLAG和不可用的服务,
create your own TCP Datagram by implementing a raw socket interface .
在本例中,您可以分析数据报的 Headers . 实现这样的Socket需要管理权限(我认为你在PC端有) .
这是more infos hier!
希望我能帮忙