Sockets en java que no leen datos

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

Sockets en java que no leen datos

Notapor NewLog » Jue Jul 21, 2011 3:16 pm

Muy buenas paisanos!

En el título del tema no podía ser más explícito... El caso es que estoy programando una aplicación cliente (android = java) - servidor (java) y tengo un problema que me está volviendo loco. Tiene tela la cosa, ya veréis...

El caso es que la comunicación funciona correctamente hasta llegados a un punto en el que el servidor se queda clavado en un read - correctamente-, pero en el momento que el servidor hace el write el cliente no lee los datos y continua clavado en el read hasta que - tal y como he comprobado- no le envío ese dato dos veces más (ese dato es de 8 bytes).

Decir también que con Wireshark he comprobado que los 8 bytes salen del servidor correctamente, sin embargo, al cliente no le da la gana de leer.

Enganchar código es un poco complicado, os pongo el read del cliente que falla y el respectivo write del servidor. Deciros que se escribe y se lee (tanto del servidor como del cliente) a través de un DataOutputStream y un InputDataStream.


Código de escritura en el servidor:
Código: Seleccionar todo
Long lLength = new Long(length);
         byte [] bLength = this.longToBytes(lLength.longValue());
         dos.write(bLength);
         dos.flush();
         
         dos.write(bLength);
         dos.flush();
         
         dos.write(bLength);
         dos.flush();

Lo que hace es pasar un valor de tipo long a un byte[]. Esto lo hago porque cuando hacía un dos.writeLong() el cliente no lo leía. Como ya os he dicho, hasta que no hago el tercer write, el cliente no lee nada... Decir que los flush() ya son por ir a la desesperada!

Código de lectura del cliente:
Código: Seleccionar todo
byte length[] = {0,0,0,0,0,0,0,0};
         dis.read(length);

El flujo del programa no continua hasta que el servidor le hace el tercer write...

Por último, os enlazo la captura que he realizado con el WireShark. Sólo están los datos relativos a la comunicación entre servidor y cliente. Como podréis ver, la cadena de bytes se envía tres veces, y las tres veces el cliente responde con un ACK. O sea, que en teoría lo debería recibir correctamente. Por cierto, el wireshark me ha guardado la captura sin extensión... Imagino que debería ser pcap.

Captura de red

La verdad es que no entiendo porqué pasa esto. He buscado y rebuscado pero no he encontrado nada (todo el mundo tiene problemas con el readLine() al no pasarle el finalizador de cadena, pero nadie con un simple y pobre read()). El tema ha de estar en los búfers de entrada del socket o algo así...

Por cierto, como servidor he probado W7 y WXPSP3 y el cliente, bueno, es un Android.

Llevo mucho tiempo atascado con esto, así que si alguien descubre el porqué le deberé una birra en la próxima Rooted, NcN o donde sea ;)
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Sockets en java que no leen datos

Notapor vlan7 » Jue Jul 21, 2011 4:34 pm

Igual es una chorrada lo que voy a decir, pero por si acaso...

En el servidor haces un dos.write y en el cliente un dis.read ¿es correcto eso? (la o por la i). Como ambas teclas estan juntas me he atrevido a postear esto.

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Sockets en java que no leen datos

Notapor NewLog » Jue Jul 21, 2011 6:49 pm

Haces bien en decir este tipo de cosas, son las típicas cosas que te llevan horas y que das por supuesto que están bien, y luego...

Pero este no es el caso, está bien. El tema es complicado porqué leo y escribo siempre igual, pero justo en ese write/read la cosa no funciona bien.

En el cliente, inicializo los 'búfers' así:
Código: Seleccionar todo
socket = new Socket(sIP, oiPort.intValue());
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());


Por lo que para leer, tengo que hacer dis.read() ya que el objeto dis es el que está asociado con el 'búfer' de entrada del socket. En el servidor está exactamente igual, con lo que para escribir por el socket lo hago a través del objeto dos.

Gracias!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Sockets en java que no leen datos

Notapor NewLog » Mar Jul 26, 2011 8:38 pm

Gente!

Alguien sabe donde podría preguntar? Algún foro de Java que sea bueno o algo por el estilo. He preguntado en StackOverflow y estoy igual, nadie me ha podido echar un cable.

Saludos!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Sockets en java que no leen datos

Notapor Arakiss » Mar Jul 26, 2011 9:03 pm

Hola:

Aunque soy estudiante de Java no puedo ayudarte mis conocimientos son un tanto limitados , podrías intentar preguntar en Java Hispano igual te ayuda.

Lo siento no puedo hacer mas :(
//When I wrote this, only God and I understood that I was doing
//Now, God only knows

Imagen

https://petruarakiss.com
Avatar de Usuario
Arakiss
<|:-D
<|:-D
 
Mensajes: 1332
Registrado: Mié Ene 11, 2006 3:41 pm
Ubicación: Madrid

Re: Sockets en java que no leen datos

Notapor kurin » Vie Dic 16, 2011 1:10 am

Hola:

Perdón por responder un porron de meses después, pero tengo curiosidad de saber si lo arreglaste al final (imagino que sí). Para mí, parece un problema de que Java no esta leyendo "dis" correctamente y por lo tanto hay que utilizarlo en otra forma. Pero no soy ningún experto en Java ni nada :P

Saludos!
ImagenImagen
Avatar de Usuario
kurin
<|:-)
<|:-)
 
Mensajes: 674
Registrado: Vie Mar 11, 2005 4:15 pm
Ubicación: emerge --update kurin

Re: Sockets en java que no leen datos

Notapor vlan7 » Vie Dic 16, 2011 5:34 pm

Hola,

De nuevo comentaros que no se nada de Java, pero leyendo que haces tres writes estoy recordando que cuando me enseñaron a programar con sockets en C en la facultad, en un protocolo orientado a conexion como entiendo que estas usando, teniamos que esperar los ACKs que confirmaran que el paquete habia sido recibido en el otro lado y que ademas el otro lado habia confirmado la recepcion de esos paquetes y esa confirmacion nos habia llegado.

Entonces y solo entonces podiamos continuar hablando entre las dos maquinas. No recuerdo como lo haciamos en C, pero si recuerdo que los procesos en unix se intercomunicaban de forma similar, tu que eres programador te sonaran las llamadas fork / exec /wait porque mil veces tuve que usar en su dia esas tres instrucciones juntas.

Yo creo que en Java debes implementar algun tipo de espera similar, cosa que en tu codigo inicial no estabas haciendo. No se como se hace en Java, pero conceptualmente una comunicacion TCP funciona asi siempre, para eso es un protocolo orientado a conexion.

Pienso que deberias tirar por ahi para resolver el problema.

Un saludo.
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Sockets en java que no leen datos

Notapor NewLog » Sab Dic 17, 2011 6:08 pm

Buenas a todos!

Uff, ya me había olvidado de este hilo y los quebraderos de cabeza que me dió. Y como me acostumbra a pasar, mis grandes problemas vienen de malditos y estúpidos errores.

vlan7, el tema de los ack lo hacía a mi manera con mensajes de confirmación y la cosa funcionaba menos cuando de golpe dejaba de recibir datos. Aun así, después de descubrir el error una de las soluciones era pasar por el wait() - signal() que comentas, pero claro, primero tuve que enterarme qué huevos estaba fallando.

Resumiendo, en los foros de oracle después de 3 páginas de discusión (con dos tios de más 13000 mensajes cada uno xD) y después de que me dejaran a la altura del betún (muy amablemente y justificadamente, todo sea dicho) encontramos el estúpido error:

El tema es que yo tenía mi thread principal en el que llevaba a cabo toda la comunicación "protocolaria" pero cuando me llegaba una trama para hacer una transferencia de un archivo grande, creaba otro thread para que la aplicación no se quedara congelada mientras se llevaba a cabo la transferencia. Imagino que todos ya veréis el problema, pero yo me quedé a cuadros cuando el servidor enviaba los datos y mi cliente, parado en el read() no leía una mierda. Y el debuger no me ayudó.
Cual era el problema? Pues que el thread principal que hacia la comunicación "protocolaria" TAMBIÉN estaba parado en un maldito read() y no hubo manera de que me enterara. En fin, muy estúpido.

Pero también fue duro encontrar una solución una vez encontrado el problema. Una opción era utilizar semáforos, o lo que en Java es sincronizar métodos.
En fin, antes de hablar con los del foro de oracle yo hacia las cosas con 3 threads (festival del humor), y después lo conseguí con menos. Pero claro, mientras realizas una descarga has de continuar escuchando a ver si el servidor te envía alguna trama de control. Lo cierto es que no recuerdo la solución exacta. Pero el problema era ese.

kurin, esas paranoias fueron las que ocuparon mi cabeza durante días o semanas... Y claro, imagina la de tiempo que perdí haciendo las cosas de 100 maneras diferentes...

Cuanto hype para un error tan cutre!
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Sockets en java que no leen datos

Notapor vlan7 » Lun Dic 19, 2011 2:41 pm

Pues nada, me alegro de que lo lograras.

NewLog escribió:hacia las cosas con 3 threads (festival del humor), y después lo conseguí con menos

:embudito:
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP


Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados