¿Cómo puedo saber si todavía escucho un socket en Android?

Soy responsable de algún código en un dispositivo Android que habla con un PC a través de WiFi a través de un punto de acceso inalámbrico (WAP), utilizando TCP enviando paquetes de ida y vuelta. En el lado del PC, el software usa winsock para enviar y recibir paquetes con el dispositivo Android, pero no tengo acceso ni control sobre el lado de PC de esta conexión.

Esta arquitectura funciona bien enviando y recibiendo, pero si no hay tráfico por exactamente 1 minuto , entonces si el PC intenta enviar un paquete al Android consigue un RST de vuelta, como si el Android ya no esté escuchando. Winsock, en el lado de PC, está interpretando esto es un tiempo de espera.

El dispositivo Android está configurado para mantener el WiFi "siempre encendido". Estoy usando un socket java.net (Android API 16) en mi código. ¿Hay algo que pueda comprobar en ese socket periódicamente, o un evento que pueda recibir para ver si he dejado de escuchar?

(Edit) Me estoy refiriendo específicamente a si el Android está escuchando . Después de 1 minuto, el dispositivo Android todavía puede enviar . Aquí hay un rastro de Wireshark que ilustra esto:

  • 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

El Android es 10.1.2.1, el PC es 10.1.2.11. En este ejemplo inicié un envío desde el Android a la PC, y fue muy bien. El PC trató de enviar algo en respuesta, pero el Android envió un [RST]

También NB que esto sólo se refiere a TCP – si el PC intenta hacer ping al Android después de 1 minuto todavía obtiene una respuesta, pero ping es ICMP.

Editar 2

Alguien quería ver cómo crear el socket. Asi que aqui esta:

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); } 

Después lo hago …

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

    One Solution collect form web for “¿Cómo puedo saber si todavía escucho un socket en Android?”

    Usted tiene que comunicarse dispositivos.

    • Dispositivo Android
    • Y PC

    Su dispositivo Android está enviando un indicador RST que significa que no hay servicio disponible en el puerto de destino.

    Programáticamente Para detectar dicho FLAG y, respectivamente, el Servicio no disponible,

    Cree su propio datagrama TCP implementando una interfaz de socket sin procesar .

    En este caso puede analizar los encabezados del datagrama. La implementación de este socket requiere de privilegios administrativos (que creo que tiene en el lado de la PC).

    ¡Aquí hay más información !

    Espero poder ayudar

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.