Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DrKillador en 26 Febrero 2013, 08:52 am



Título: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: DrKillador en 26 Febrero 2013, 08:52 am
Hola! estoy haciendo una practica de la facultad en la que tengo que programar un sencillo msn/chat con sockets en C. Para ello, tengo una conversaciones en un fichero de texto, que tengo que leer y enviar a un servidor que está esperando.

Pero tengo un problema, si pongo el texto de la conversacion "a fuego" en una variable y la envio, todo va bien:

Código
  1. char *sc="hola!";
  2.    resp=sendto(conn_socket,
  3.                sc,
  4.                strlen(sc),
  5.                0,
  6.                (struct sockaddr *)&server,
  7.                sizeof(struct sockaddr)
  8.              );

Pero si primero leo el texto del archivo, y despues lo envio, se me produce un error en el servidor. Creo que es porque en el caso anterior creo la variable cadena del tamaño exacto a los datos que envío, y en el otro, creo una cadena de tamaño grande (MAXBUFLEN) y despues le agrego los datos, y claro, debe haber basura al final de la cadena. ¿Como podria solucionarlo?

Código
  1. char sc[MAXBUFLEN]="";
  2.    FILE *pFichero;
  3.    pFichero=fopen(PathFichero, "rb");
  4.    int x=0;
  5.    while (!feof(pFichero))
  6.    {
  7.        sprintf(sc,"%s%c",sc,fgetc(pFichero));
  8.        x++;
  9.    }
  10.    sc[x-1]='\0';
  11.    fclose(pFichero);
  12.    //Comprobamos que se haya leido bien el fichero
  13.    printf("[%s]",sc);
  14.    //Enviamos la conversacion
  15.    resp=sendto(conn_socket,
  16.                sc,
  17.                strlen(sc),
  18.                0,
  19.                (struct sockaddr *)&server,
  20.                sizeof(struct sockaddr)
  21.              );

Gracias!


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: naderST en 26 Febrero 2013, 17:56 pm
Es porque lo estás leyendo como binario y lo estás tratando como una cadena, es decir, cómo sabes que strlen() no se topa con '\0' en algún punto que no sea al final real de la cadena, no puedes depender de un delimitador así. Lo que puedes hacer es calcular el tamaño del archivo y almacenar la información en un buffer y enviar eso al servidor.


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: amchacon en 26 Febrero 2013, 18:11 pm
El fallo es que la cadena no tiene el caracter nulo '\0' que indica el fin de cadena.


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: naderST en 26 Febrero 2013, 19:08 pm
El fallo es que la cadena no tiene el caracter nulo '\0' que indica el fin de cadena.

Sí lo tiene
Código
  1. sc[x-1]='\0';
  2.  


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: DrKillador en 27 Febrero 2013, 09:19 am
Gracias a ambos por las ideas, efectivamente amchacon el caracter nulo se lo incluía.

Hice los cambios que me recomendaste naderST (no sé si correctamente), pero sigo teniendo el problema:

Código
  1. FILE *pFichero;
  2.  
  3. //Comprobamos el tamano del fichero para establecer el tamano del buffer
  4. char sc[MAXBUFLEN]="";
  5. pFichero=fopen(PathFichero, "r");
  6. int cont=0;  
  7. while (!feof(pFichero))
  8. {
  9. fgetc(pFichero);
  10. cont++;
  11. }
  12. fclose(pFichero);  
  13.  
  14. //Leemos la conversacion desde el fichero y la guardamos en un buffer que tiene el tamano igual al numero de elementos que leeremos del fichero
  15. char sc2[cont]="";
  16. pFichero=fopen(PathFichero, "r");    
  17. while (!feof(pFichero))    
  18. {        
  19. sprintf(sc2,"%s%c",sc2,fgetc(pFichero));          
  20. }
  21. fclose(pFichero);  
  22.  
  23. //Enviamos la conversacion    
  24. resp=sendto(conn_socket,                
  25. sc2,                
  26. strlen(sc2),                
  27. 0,                
  28. (struct sockaddr *)&server,                
  29. sizeof(struct sockaddr)              
  30. );

Saludos


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: naderST en 27 Febrero 2013, 11:54 am
Específicamente qué problema te está dando? Corrígeme si me equivoco: Estás intentando de enviar un archivo de texto con sockets?


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: DrKillador en 27 Febrero 2013, 12:05 pm
No estoy intentando enviar el archivo, sino un string con texto, mira te copio el codigo completo del cliente.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <winsock.h>
  5. #include <string.h>
  6. #include <conio.h>
  7.  
  8. #define MAXBUFLEN 2048
  9. #define PORT 4950
  10.  
  11. char SendBuff[MAXBUFLEN]="";
  12.  
  13. int main(int argc, char *argv[]){
  14.  WSADATA wsaData;
  15.  SOCKET conn_socket;
  16.  struct sockaddr_in server;
  17.  struct hostent *hp;
  18.  int resp;
  19.  
  20.  
  21.  //Inicializamos la DLL de sockets
  22.  resp=WSAStartup(MAKEWORD(1,0),&wsaData);
  23.  if(resp){
  24.    printf("Error al inicializar socket\n");
  25.    getchar();return -1;
  26.  }
  27.  
  28.  //Obtenemos la IP del servidor... en este caso
  29.  // localhost indica nuestra propia máquina...
  30.  hp=(struct hostent *)gethostbyname(argv[1]);
  31.  
  32.  if(!hp){
  33.    printf("No se ha encontrado servidor...\n");
  34.    getchar();WSACleanup();return WSAGetLastError();
  35.  }
  36.  
  37.  // Creamos el socket...
  38.  conn_socket=socket(AF_INET,SOCK_DGRAM, 0);
  39.  if(conn_socket==INVALID_SOCKET) {
  40.    printf("Error al crear socket\n");
  41.    getchar();WSACleanup();return WSAGetLastError();
  42.  }
  43.  
  44.  memset(&server, 0, sizeof(server)) ;
  45.  memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
  46.  server.sin_family = hp->h_addrtype;
  47.  server.sin_port = htons(PORT);
  48.    //vemos el numero de elementos del fichero
  49.    FILE *pFichero;
  50.    pFichero=fopen(argv[2], "r");
  51.    int x=0;
  52.    while (!feof(pFichero))
  53.    {
  54.        fgetc(pFichero);
  55.        x++;
  56.    }
  57.    fclose(pFichero);
  58.  
  59.    printf("%d\n",x);
  60.  
  61.    //recuperar archivo
  62.    char sc2[x];
  63.    pFichero=fopen(argv[2], "r");
  64.    while (!feof(pFichero))
  65.    {
  66.        sprintf(sc2,"%s%c",sc2,fgetc(pFichero));
  67.    }
  68.    fclose(pFichero);
  69.  
  70.    resp=sendto(conn_socket,
  71.                sc2,
  72.                strlen(sc2),
  73.                0,
  74.                (struct sockaddr *)&server,
  75.                sizeof(struct sockaddr)
  76.              );
  77.    if(resp==SOCKET_ERROR){
  78.        printf("Error al enviar datos...\n");
  79.        closesocket(conn_socket);WSACleanup();
  80.        getchar();return WSAGetLastError();
  81.    }
  82.  
  83.  // Visualizamos resultado...
  84.  printf("Enviados %d bytes hacia %s\n",resp,inet_ntoa(server.sin_addr));
  85.  getchar();
  86.  
  87.  // Cerramos el socket y liberamos la DLL de sockets
  88.  closesocket(conn_socket);
  89.  WSACleanup();
  90.  return EXIT_SUCCESS;
  91. }
  92.  
  93. Gracias!


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: naderST en 27 Febrero 2013, 12:10 pm
Código
  1.    char sc2[256];
  2.    FILE *pFichero;
  3.    pFichero=fopen(argv[2], "r");
  4.    fgets(sc2, sizeof(buffer), pFichero);
  5.    fclose(pFichero);
  6.  
  7.    resp=sendto(conn_socket,
  8.                sc2,
  9.                strlen(sc2),
  10.                0,
  11.                (struct sockaddr *)&server,
  12.                sizeof(struct sockaddr)
  13.              );
  14.  


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: DrKillador en 27 Febrero 2013, 12:51 pm
Dos preguntas, pq seria 256 el tamaño de sc2? donde pones buffer te quieres referir a sc2?

Muchas gracias


Título: Re: [AYUDA] [C] Problema al leer archivo texto y enviar
Publicado por: naderST en 27 Febrero 2013, 13:09 pm
Dos preguntas, pq seria 256 el tamaño de sc2? donde pones buffer te quieres referir a sc2?

Muchas gracias

Es un tamaño arbitrario, podrías hacer lo que estabas haciendo de contar cuantos caracteres hay en el archivo y hacer sc2 de ese tamaño + 1 para el caracter nulo. Sí, donde coloqué buffer me refería a sc2.