Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/12/2010, 18:29
7th_Sign
 
Fecha de Ingreso: noviembre-2007
Mensajes: 35
Antigüedad: 16 años, 5 meses
Puntos: 0
manejo de Sockets

hola a todos,

Un poco de antecedente:
Tengo un software en windows que recibe y envía datos por el puerto 8500 (tcp) y necesito hacer ese mismo programa pero que funcione en linux ya que hay que hacerle unas modificaciones y ademas no tenemos el fuente :S
Elegí java para no batallar por el sistema operativo.

Lo único que tengo es la documentación del protocolo de trasmisión, es decir, lo que significan los códigos hex que recibe y cuáles son los que puede enviar para que hagan algún efecto en el cliente.

Un ligero analisis de lo que pretendo hacer
He monitoreado la trasmisión de paquetes con el tcpdump y lo extraño que vi es que una vez que el cliente le manda un Sync al servidor, la conexión establecida nunca finaliza (no hay FIN, ni RESET) y es a travez de esta que se hacen las recepciones y envíos de datos mientras ambos este encendidos obviamente.


Mi avance

Trato de igualar este comportamiento para una prueba del concepto con el siguiente código:
Código java:
Ver original
  1. ...
  2. ServerSocket welcomeSocket = new ServerSocket(8500);
  3. while (true) {
  4.    System.out.println("Esperando: ");
  5.    Socket connectionSocket = welcomeSocket.accept();
  6.  
  7.    System.out.println("llego un cliente: ");
  8.    BufferedReader inFromClient = new BufferedReader(
  9.     new InputStreamReader(connectionSocket.getInputStream()));
  10.    clientSentence = inFromClient.readLine();
  11.    trama = clientSentence.getBytes();
  12.    /* algunas condiciones para saber si hay que enviar datos según lo que
  13.        diga la documentación del protocolo de comunicación
  14.        por ejemplo si manda el código 5001 hay que contesta con 4001
  15.        que indica que la conexión ha sido establecida*/
  16.  
  17.    /*¿debo cerrar la conexión?*/
  18.    connectionSocket.close();
  19. }

El problema
Aquí el problema que tengo es que el connectionSocket.close(); cierra la conexión (obviamente), (manda FIN y RESET) y entonces ya no puedo enviar datos al cliente, y el cliente a cada instante me manda la trama que indica establecer conexión (cuando esta solo la espero la primera vez que hay comunicación entre ambos)

Intente simplemente eliminar la línea connectionSocket.close(); y aunque no marca error al compilar, puedo recibir la primera trama pero ya no puedo mas, se queda en el mensaje Esperando: y si es un hecho que el cliente sigue mandando porque el tcpdump muestra actividad

intente con connectionSocket.shudownInput(); y sucede lo mismo, sigo sin poder recibir mas de un paquete o trama

La pregunta:
pues basicamente es eso, ¿cómo puedo hacerle para recibir paquetes sin que el servidor mande un FIN o RESET?


cualquier orientación al respecto se los agradeceré.