• Viernes 8 de Noviembre de 2024, 19:13

Autor Tema:  problemas en C  (Leído 3568 veces)

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
problemas en C
« en: Martes 26 de Agosto de 2008, 12:46 »
0
Hola! Estoy intentando realizar un servidor de chat 1 a 1 pero estoy un poco perdida!!Se supone q al ejecutar un comando al que le he llamado /log tiene q guardarme la conversacion en un fichero, cual es mi sorpresa q solamente guarda la parte de aquel q ha ejecutado dicho comando!ais...Donde puede estar el error¿?El codigo  de la instruccion es el mismo para el servidor y el cliente y es el siguiente:
Código: Text
  1.  
  2. if (strcmp(txt,"/log")==0)
  3.                 {
  4.                     printf("Dame el nombre del fichero: n");
  5.                     scanf("%s",string);
  6.                     f=fopen(string,"w");
  7.                     if (f==NULL)
  8.                     {
  9.                         printf("No puedo abrir el fichero %sn",string);
  10.                         return;
  11.                     }
  12.                     indicador=1;
  13.                 }
  14. //El siguiente comando sirve para dejar de guardar la conversacion en un fichero, es el contrario del comando log
  15. if (strcmp(txt,"/nolog")==0)
  16.                 {  
  17.                     indicador=0;    
  18.                     fclose(f);
  19.                 }
  20.  
  21.  

Estoy abierta a sugerencias!Agredecere mogollon vuestra colaboracion!Gracias!Muakas

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #1 en: Martes 26 de Agosto de 2008, 13:05 »
0
Pero no pones el código del guardado, sólo de las comparaciones, que por cierto:

Código: Text
  1.  
  2. if (strcmp(txt,"/log")==0)
  3. if (f==NULL)
  4.  
  5.  

así queda más C expert  :P

Código: Text
  1.  
  2. if (!strcmp(txt,"/log"))
  3. if (!f)
  4.  
  5.  

Y por favor, lee mi firma. Para que no tenga que dejarme la retina, que mi pantalla es una CRT.

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: problemas en C
« Respuesta #2 en: Martes 26 de Agosto de 2008, 13:10 »
0

En primer lugar muchisimas gracias por tu contestacion!Lo unico,no entiendo lo q me quieres decir con el código del guardado!Lo q te he enviado es la parte q se refiere a esos comandos!Me podrias explicar porfa¿?Gracias!Muakas

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #3 en: Martes 26 de Agosto de 2008, 13:49 »
0
Cita de: "Iosune"
tiene q guardarme la conversacion en un fichero

En tu código no veo por la parte de guardar, sino sólo la apertura del fichero con fopen() y las comparaciones que ya te comenté.

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: problemas en C
« Respuesta #4 en: Martes 26 de Agosto de 2008, 22:24 »
0
Parece ser q puede q me falte la instruccion correspondiente para guardar la conversación en el fichero, estoy super perdida!A alguien se le ocurre como¿?Gracias!!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #5 en: Miércoles 27 de Agosto de 2008, 09:00 »
0
También te falta ponernos dónde está la conversación para que podamos guardarla.

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: problemas en C
« Respuesta #6 en: Jueves 28 de Agosto de 2008, 10:16 »
0
Código: Text
  1.  
  2. pid=fork();
  3.        
  4.         //El hijo envia a la pantalla todo lo recibido desde el otro extremo
  5.         if (pid==0)
  6.         {
  7.             while(1)
  8.             {
  9.                 leidos=read(c_sock,buf,2000);
  10.                 if (leidos>0)
  11.                 {  
  12.                     buf[leidos]=0;
  13.                     printf("Cliente dice: %sn",buf);
  14.                     if (indicador==1)
  15.                     {
  16.                         fprintf(f,"%sn",buf);
  17.                     }
  18.                 }
  19.                 else
  20.                 {
  21.                     printf("nEl otro extremo ha cerrado la conexionn");
  22.                     close(c_sock);
  23.                     close(sock);
  24.                     exit(0);
  25.                 }
  26.             }
  27.         }
  28.         //El programa principal envia todo lo recibido por teclado
  29.         else
  30.         {
  31.             printf("Conexion aceptadanEscriba /quit para salirn");
  32.             printf("Escriba /info para obtener informacion sobre el otro extremon");
  33.             printf("Escriba /log si desea guardar la conversacion en un ficheron");
  34.             printf("Escriba /nolog si lo que desea es dejar de guardar la conversacion en un ficheron");
  35.             while(1)
  36.             {
  37.                 leer_cad(txt);
  38.                 if (!strcmp(txt,"/quit"))
  39.                 {
  40.                     close(sock);
  41.                     kill(pid,SIGKILL);
  42.                     exit(0);
  43.                 }
  44.                 if (!strcmp(txt,"/info"))
  45.                 {
  46.                     printf("La conexion ha sido establecida con n");
  47.                     printf("la ip %d.%d.%d.%d puerto %sn",ip[0],ip[1],ip[2],ip[3],argv[2]);
  48.                 }
  49.                 if (!strcmp(txt,"/log"))
  50.                 {
  51.                     printf("Dame el nombre del fichero: n");
  52.                     scanf("%s",string);
  53.                     f=fopen(string,"w");
  54.                     if (!f)
  55.                     {
  56.                         printf("No puedo abrir el fichero %sn",string);
  57.                         return;
  58.                     }
  59.                     indicador=1;
  60.                 }
  61.                 if (!strcmp(txt,"/nolog"))
  62.                 {  
  63.                     indicador=0;    
  64.                     fclose(f);
  65.                 }
  66.                 else
  67.                 {
  68.                     write(c_sock,txt,sizeof(txt));
  69.                     if (indicador==1)
  70.                     {
  71.                         fprintf(f,"%sn",txt);
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.     }
  77. }
  78.  
  79.  

mando otra parte del codigo a ver si esta lo q me pides y sino, sera q no esta!Gracias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #7 en: Jueves 28 de Agosto de 2008, 11:00 »
0
Esta es la parte que guarda los datos en el fichero:

76. fprintf(f,"%sn",txt);

Como vemos, escribe la variable txt, cuya única posible asignación en el código que me has mandado puede ser

38. leer_cad(txt);

Por tanto, necesitamos el código de
Código: C
  1. void leer_cad(char * txt)
  2.  
para resolver tu problema...

 -_-

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: problemas en C
« Respuesta #8 en: Jueves 28 de Agosto de 2008, 11:33 »
0
Código: Text
  1. void leer_cad(char p[])
  2. {
  3.      int c,i=0;
  4.     c=getchar();
  5.     while (c!='n')
  6.     {
  7.         p[i]=c;
  8.         i++;
  9.         c=getchar();
  10.     }
  11.     p[i]=0;
  12.     return;
  13.  

EI: USA LA ETIQUETA CODE POR FAVOR!

Moskito eres un crack!Esta es mi funcion leer_cad.Los parametros de mi funcion no acaban de coincidir con lo q has puesto pero bueno...ahi te lo mando!Muaks

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #9 en: Jueves 28 de Agosto de 2008, 13:31 »
0
Cita de: "Iosune"
.Los parametros de mi funcion no acaban de coincidir con lo q has puesto

Sí que coinciden, puntero a char  :P (otra cosa es el nombre del parámetro, no puedo ser adivino,  :no: )

Supongo que sock es donde escribe el servidor (proceso hijo) y c_sock donde escribe el cliente (proceso padre), si no es así corrígeme.

Visto que leer_cad() sólo obtiene la entrada del teclado, es imposible que su valor devuelto por referencia (txt) contenga los datos enviados por el  socket c_sock. Tienes 2 opciones para solucionarlo:

1. El servidor va guardando todo en un fichero temporal, que en caso de que se quiera guardar se copia a otro permanente, en caso de que no, se borra.

2. Igual que la 1 pero en vez de un fichero temporal en una variable en memoria (con ésta cuidado porque si la conversación es muy larga, la memoria se puede quedar corta).

Otra cosilla: yo que tú primero compararía si la cadena introducida en el servidor comienza por "/" en vez de tener que hacer todas las comparaciones cada vez. En caso de que sea "/" ya comparamos los comandos y los procesamos. Así evitas comparaciones innecesarias.

lostshell

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: problemas en C
« Respuesta #10 en: Jueves 28 de Agosto de 2008, 19:18 »
0
El problema esta en la variable indicador, los forks hasta donde tengo entendido no comparten la memoria, por lo cual si cambias una variable en el proceso padre, el hijo no va a cambiar. Te sugiero que antes del if(indicador==1), pongas printf( "indicador: %dn", indicador )(en el proceso hijo y en el padre) solo para que compruebes lo que te digo.
Para hacer lo que quieres tendras que buscar otra forma de comunicar el proceso hijo con el padre (creo que con pipe se hace eso)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #11 en: Jueves 28 de Agosto de 2008, 19:54 »
0
Cita de: "lostshell"
los forks hasta donde tengo entendido no comparten la memoria

Cita de: "lostshell"
si cambias una variable en el proceso padre, el hijo no va a cambiar

Es cierto, no comparten memoria, pero de todas formas el hijo no hace uso de indicador que es meramente para saber si tenemos que guardar o no la conversación (sólo para el proceso padre).

lostshell

  • Miembro activo
  • **
  • Mensajes: 35
    • Ver Perfil
Re: problemas en C
« Respuesta #12 en: Jueves 28 de Agosto de 2008, 20:07 »
0
Cita de: "m0skit0"
Cita de: "lostshell"
los forks hasta donde tengo entendido no comparten la memoria

Cita de: "lostshell"
si cambias una variable en el proceso padre, el hijo no va a cambiar

Es cierto, no comparten memoria, pero de todas formas el hijo no hace uso de indicador que es meramente para saber si tenemos que guardar o no la conversación (sólo para el proceso padre).
revisa la linea 14 del codigo que puso

Iosune

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: problemas en C
« Respuesta #13 en: Viernes 29 de Agosto de 2008, 10:11 »
0
Tengo un conocimiento muy muy limitado de C xq todavia estoy aprendiendo (por eso tengo tantos problemas ) pero creo q mi hijo si q hace uso de la variable indicador (linea 14). Si es asi q debo hacer¿? hay alguna manera para q pueda pasarse la info. ¿? Gracias!!!Muaka

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas en C
« Respuesta #14 en: Viernes 29 de Agosto de 2008, 11:10 »
0
Cita de: "lostshell"
revisa la linea 14 del codigo que puso

Sí es cierto, perdón.

Cita de: "Iosune"
Tengo un conocimiento muy muy limitado de C


¿Y directamente te metes con fork()? Yo que tú empezaría con asuntos más sencillos. Como comenta acertadamente lostshell necesitas comunicar los dos procesos de alguna forma, con tuberías (pipes) por ejemplo.