[AYUDA] [C] Problema al leer archivo texto y enviar

Iniciado por DrKillador, 26 Febrero 2013, 08:52 AM

0 Miembros y 1 Visitante están viendo este tema.

DrKillador

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:

char *sc="hola!";
    resp=sendto(conn_socket,
                sc,
                strlen(sc),
                0,
                (struct sockaddr *)&server,
                sizeof(struct sockaddr)
              );


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?

char sc[MAXBUFLEN]="";
    FILE *pFichero;
    pFichero=fopen(PathFichero, "rb");
    int x=0;
    while (!feof(pFichero))
    {
        sprintf(sc,"%s%c",sc,fgetc(pFichero));
        x++;
    }
    sc[x-1]='\0';
    fclose(pFichero);
    //Comprobamos que se haya leido bien el fichero
    printf("[%s]",sc);
    //Enviamos la conversacion
    resp=sendto(conn_socket,
                sc,
                strlen(sc),
                0,
                (struct sockaddr *)&server,
                sizeof(struct sockaddr)
              );


Gracias!
Python <3 Python

naderST

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.

amchacon

El fallo es que la cadena no tiene el caracter nulo '\0' que indica el fin de cadena.
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

Cita de: 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.

Sí lo tiene

sc[x-1]='\0';

DrKillador

#4
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:

FILE *pFichero;

//Comprobamos el tamano del fichero para establecer el tamano del buffer
char sc[MAXBUFLEN]="";
pFichero=fopen(PathFichero, "r");
int cont=0;  
while (!feof(pFichero))
{
fgetc(pFichero);
cont++;
}
fclose(pFichero);  

//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
char sc2[cont]="";
pFichero=fopen(PathFichero, "r");    
while (!feof(pFichero))    
{        
sprintf(sc2,"%s%c",sc2,fgetc(pFichero));          
}
fclose(pFichero);  

//Enviamos la conversacion    
resp=sendto(conn_socket,                
sc2,                
strlen(sc2),                
0,                
(struct sockaddr *)&server,                
sizeof(struct sockaddr)              
);


Saludos
Python <3 Python

naderST

Específicamente qué problema te está dando? Corrígeme si me equivoco: Estás intentando de enviar un archivo de texto con sockets?

DrKillador

#6
No estoy intentando enviar el archivo, sino un string con texto, mira te copio el codigo completo del cliente.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <string.h>
#include <conio.h>

#define MAXBUFLEN 2048
#define PORT 4950

char SendBuff[MAXBUFLEN]="";

int main(int argc, char *argv[]){
 WSADATA wsaData;
 SOCKET conn_socket;
 struct sockaddr_in server;
 struct hostent *hp;
 int resp;


 //Inicializamos la DLL de sockets
 resp=WSAStartup(MAKEWORD(1,0),&wsaData);
 if(resp){
   printf("Error al inicializar socket\n");
   getchar();return -1;
 }

 //Obtenemos la IP del servidor... en este caso
 // localhost indica nuestra propia máquina...
 hp=(struct hostent *)gethostbyname(argv[1]);

 if(!hp){
   printf("No se ha encontrado servidor...\n");
   getchar();WSACleanup();return WSAGetLastError();
 }

 // Creamos el socket...
 conn_socket=socket(AF_INET,SOCK_DGRAM, 0);
 if(conn_socket==INVALID_SOCKET) {
   printf("Error al crear socket\n");
   getchar();WSACleanup();return WSAGetLastError();
 }

 memset(&server, 0, sizeof(server)) ;
 memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
 server.sin_family = hp->h_addrtype;
 server.sin_port = htons(PORT);
   //vemos el numero de elementos del fichero
   FILE *pFichero;
   pFichero=fopen(argv[2], "r");
   int x=0;
   while (!feof(pFichero))
   {
       fgetc(pFichero);
       x++;
   }
   fclose(pFichero);

   printf("%d\n",x);

   //recuperar archivo
   char sc2[x];
   pFichero=fopen(argv[2], "r");
   while (!feof(pFichero))
   {
       sprintf(sc2,"%s%c",sc2,fgetc(pFichero));
   }
   fclose(pFichero);

   resp=sendto(conn_socket,
               sc2,
               strlen(sc2),
               0,
               (struct sockaddr *)&server,
               sizeof(struct sockaddr)
             );
   if(resp==SOCKET_ERROR){
       printf("Error al enviar datos...\n");
       closesocket(conn_socket);WSACleanup();
       getchar();return WSAGetLastError();
   }

 // Visualizamos resultado...
 printf("Enviados %d bytes hacia %s\n",resp,inet_ntoa(server.sin_addr));
 getchar();

 // Cerramos el socket y liberamos la DLL de sockets
 closesocket(conn_socket);
 WSACleanup();
 return EXIT_SUCCESS;
}

Gracias!
Python <3 Python

naderST


    char sc2[256];
    FILE *pFichero;
    pFichero=fopen(argv[2], "r");
    fgets(sc2, sizeof(buffer), pFichero);
    fclose(pFichero);

    resp=sendto(conn_socket,
                sc2,
                strlen(sc2),
                0,
                (struct sockaddr *)&server,
                sizeof(struct sockaddr)
              );

DrKillador

Dos preguntas, pq seria 256 el tamaño de sc2? donde pones buffer te quieres referir a sc2?

Muchas gracias
Python <3 Python

naderST

Cita de: 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

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.