Foros del Web » Programación para mayores de 30 ;) » C/C++ »

sockets entre c y java

Estas en el tema de sockets entre c y java en el foro de C/C++ en Foros del Web. Hola a todos. Llevo tiempo programando con sockets en java y la verdad nunca habia tenido problemas. Incluso utilizando sockets entre una pagina PHP y ...
  #1 (permalink)  
Antiguo 26/10/2007, 06:06
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Sonrisa sockets entre c y java

Hola a todos.

Llevo tiempo programando con sockets en java y la verdad nunca habia tenido problemas. Incluso utilizando sockets entre una pagina PHP y un servidor implementando en java y todo perfecto pero me he puesto a pasar una cadena por sockets desde un programa echo en C y que lo lea un servidor implementado en java y no consigo que me funcione.

Os pongo parte del código para que se entienda mejor lo que hago:


Cliente implementado en C:

(Previamente establezco la conexion con el servidor)
char *peticion="RF\n";
write(socket,peticion, sizeof peticion );



Servidor implementado en java:

cliente.servidor=cliente.serverSocket.accept();
entrada=cliente.servidor.getInputStream();
BufferedReader entrada_datos=new BufferedReader(new InputStreamReader(entrada));
peticion=entrada_datos.readLine();


Como veis el servidor implementado en java lee una linea. Por eso en mi programa en C le añadi al final el \n


Para daros mas información comentaros que el programa en C se conecta perfectamente a mi servidor en Java y cuando lee la cadena luego imprimo el valor de la variable "peticion" y me da siempre NULL.

He probado a pasarle una cadena pero esta vez con un programa implementado en java y funciona perfectamente asi que no entiendo porque en C no me funciona.



Saludos
  #2 (permalink)  
Antiguo 26/10/2007, 11:36
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: sockets entre c y java

Ya he conseguido recibir la cadena pasada

La verdad no entiendo muy bien que pasó porque no he tocado nada y ahora me funciona jeje.


Alguien sabe un ejemplo de pasar el contenido de un fichero por sockets???

Es que lo estoy haciendo y el servidor cuando recibe el resultado y lo escribe en otro fichero, me añade al principio tres caracteres que no le paso y luego al final me añade otro caracter extraño (exactamente como una 'Y' con acento).

Lo hago de esta manera:


File *fichero;
fichero=fopen("resultados.txt","r");
while(!feof(fichero)){

letra=fgetc(fichero);
write(s,&letra, sizeof letra); //Aqui estoy enviando la letra por el socket 's'

}


Si el fichero que le paso contiene esto:

casa
perro
boli


El fichero que genera el servidor con lo que le está pasando el cliente por sockets es:


escrcasa
perro
boliÿ


Como ves en la primera linea me añade un espacio y luego la cadena "esc" que nose de donde sale.

Y tambien me añade el caracter ese raro del final "ÿ"


Alguna solucion???

Los primeros caracteres parecen como si fuera basura que hubiera por el socket no??

Y el último caracter será un retorno de carro o final de fichero???

Última edición por aeb_asturias; 26/10/2007 a las 11:44
  #3 (permalink)  
Antiguo 26/10/2007, 15:07
 
Fecha de Ingreso: octubre-2007
Mensajes: 10
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: sockets entre c y java

Hola,

El comportamiento de feof() si lo recuerdo bien, es avisarte de si una función de lectura (por decirlo de alguna manera) se ha topado ya con EOF. En tu caso, cuando lees la í de boli aún ninguna función de lectura de fichero se ha topado con EOF y, por lo tanto, feof() no va a devolver falso.

Una forma tonta de arreglarlo sería algo así: colocar una condición antes del write.

if(!feof(fichero)) write(s,&letra, sizeof letra);

Con respecto al esc inicial, también parece un carácter de control. ¿Puedes adjuntar el archivo de texto que estás usando, por favor?
  #4 (permalink)  
Antiguo 26/10/2007, 16:20
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: sockets entre c y java

En primer lugar decirte que muchas gracias por responder.

El caracter ese raro "ÿ" se me ha quitado haciendo lo que me has dicho

En cuanto al archivo que le paso pues nose como se adjunta un fichero a un mensaje en este foro

Exactamente contiene:

casa
perro
boli

No tiene ninguna linea en blanco al principio ni nada raro. El fichero ese lo escribí a mano y justo al editarlo escribí directamente la palabra "casa", luego le di al boton de Intro y escribí "perro" y por último escribí "boli" asi que no entiendo de donde sale ese espacio en blanco y la palabra "esc" al principo :(


Creo que ya se donde esta el problema pero nose como se soluciona.

Antes de enviar el contenido del fichero , envio una cadena por el socket con este codigo:

char *dato="RF\n";
write(s,dato, sizeof dato);


Y luego ya le envio el contenido del fichero como he puesto en el mensaje anterior.

He probado quitando el envio de la cadena "RF\n" y solo enviando el contenido del fichero y me funciona.

Entonces.....¿que es lo que estoy haciendo mal?

La cadena "RF\n" la recibo bien.... pero parece que entre esa cadena y los primeros caracteres que envio del fichero es como si hubiera algo en el socket de "basura"..........

Hay alguna manera de limpiar el socket o algo asi????


Saludos.

Última edición por aeb_asturias; 26/10/2007 a las 16:38
  #5 (permalink)  
Antiguo 26/10/2007, 16:53
 
Fecha de Ingreso: octubre-2007
Mensajes: 10
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: sockets entre c y java

Cita:
Iniciado por aeb_asturias Ver Mensaje
Creo que ya se donde esta el problema pero nose como se soluciona.

Antes de enviar el contenido del fichero , envio una cadena por el socket con este codigo:
Código:
char *dato="RF\n";
write(s,dato, sizeof dato);
El problema está en el sizeof(dato). dato es un puntero, y su sizeof es el tamaño de un puntero, no la longitud de la cadena a enviar. Si no me equivoco, casi seguro que en el sistema donde estás ejecutando, sizeof(dato)=4 (es decir, un puntero ocupa 4 bytes).

Por lo tanto, le estás diciendo a write que escriba cuatro bytes. El primero es R, el segundo es F, y luego \n, que al escribir en algo que no es un archivo de texto, es sólo un byte. El cuarto byte de la cadena es el carácter terminador \0, que a lo mejor es lo que se te muestra como "esc" en Java.

La conclusión es que a write le tienes que pasar la longitud de la cadena a imprimir, no el tamaño del puntero que apunta a la cadena.

¿Puedes probar esto?

Código:
char *dato="RF\n";
write(s,dato, strlen(dato));
  #6 (permalink)  
Antiguo 26/10/2007, 17:03
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 9 meses
Puntos: 7
Re: sockets entre c y java

Muchas gracias por todo.

He seguido tus pasos y se ha arreglado todo a la primera. Como bien dices... era culpa del tamaño del puntero que le pasaba y no realmente de lo que ocupaba.


Que gusto da preguntar dudas en este foro


Muchas gracias por ayudarme y ser tan rápido en las respuestas. Espero algúna vez devolverte la ayuda



Un saludo.
  #7 (permalink)  
Antiguo 27/10/2007, 03:02
 
Fecha de Ingreso: octubre-2007
Mensajes: 10
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: sockets entre c y java

Cita:
Iniciado por aeb_asturias Ver Mensaje
Muchas gracias por todo.

Muchas gracias por ayudarme y ser tan rápido en las respuestas. Espero algúna vez devolverte la ayuda
Un placer
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 18:17.