elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [AYUDA] [C] Problema al leer archivo texto y enviar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [AYUDA] [C] Problema al leer archivo texto y enviar  (Leído 3,714 veces)
DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
[AYUDA] [C] Problema al leer archivo texto y enviar
« 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!


En línea

Python <3 Python
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #1 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.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #2 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #3 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.  
En línea

DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #4 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
« Última modificación: 27 Febrero 2013, 11:06 am por DrKillador » En línea

Python <3 Python
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #5 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?
En línea

DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #6 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!
« Última modificación: 27 Febrero 2013, 12:07 pm por DrKillador » En línea

Python <3 Python
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #7 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.  
En línea

DrKillador

Desconectado Desconectado

Mensajes: 56



Ver Perfil
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #8 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
En línea

Python <3 Python
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [AYUDA] [C] Problema al leer archivo texto y enviar
« Respuesta #9 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema al leer archivo
Programación C/C++
m@o_614 2 1,839 Último mensaje 2 Marzo 2014, 13:25 pm
por vangodp
Ayuda al leer archivo
Programación C/C++
mnd00003 1 2,108 Último mensaje 13 Octubre 2014, 18:13 pm
por rir3760
Leer archivo de texto « 1 2 »
Programación C/C++
niraikanai 10 6,176 Último mensaje 2 Abril 2015, 07:42 am
por boy-ka
Enviar un mensaje de texto en formato PDU (Problema)
Dudas Generales
Klay 0 1,912 Último mensaje 9 Junio 2015, 01:11 am
por Klay
[AYUDA EN C] Leer texto del teclado y guardar en una variable llamada char *str
Programación C/C++
soundevice 3 2,637 Último mensaje 29 Septiembre 2016, 02:45 am
por soundevice
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines