Autor
|
Tema: [AYUDA] [C] Problema al leer archivo texto y enviar (Leído 3,714 veces)
|
DrKillador
Desconectado
Mensajes: 56
|
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, 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; { x++; } sc[x-1]='\0'; //Comprobamos que se haya leido bien el fichero //Enviamos la conversacion resp=sendto(conn_socket, sc, 0, (struct sockaddr *)&server, sizeof(struct sockaddr) );
Gracias!
|
|
|
En línea
|
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.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
El fallo es que la cadena no tiene el caracter nulo '\0' que indica el fin de cadena.
|
|
|
En línea
|
|
|
|
naderST
|
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';
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
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; { cont++; } //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"); { } //Enviamos la conversacion resp=sendto(conn_socket, sc2, 0, (struct sockaddr *)&server, sizeof(struct sockaddr) );
Saludos
|
|
« Última modificación: 27 Febrero 2013, 11:06 am por DrKillador »
|
En línea
|
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?
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
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"); } //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; { x++; } //recuperar archivo char sc2[x]; pFichero =fopen(argv [2], "r"); { } resp=sendto(conn_socket, 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)); // Cerramos el socket y liberamos la DLL de sockets closesocket(conn_socket); WSACleanup(); return EXIT_SUCCESS; } Gracias!
|
|
« Última modificación: 27 Febrero 2013, 12:07 pm por DrKillador »
|
En línea
|
Python <3 Python
|
|
|
naderST
|
char sc2[256]; FILE *pFichero; pFichero =fopen(argv [2], "r"); fgets(sc2 , sizeof(buffer ), pFichero ); resp=sendto(conn_socket, sc2, 0, (struct sockaddr *)&server, sizeof(struct sockaddr) );
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
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
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
problema al leer archivo
Programación C/C++
|
m@o_614
|
2
|
1,839
|
2 Marzo 2014, 13:25 pm
por vangodp
|
|
|
Ayuda al leer archivo
Programación C/C++
|
mnd00003
|
1
|
2,108
|
13 Octubre 2014, 18:13 pm
por rir3760
|
|
|
Leer archivo de texto
« 1 2 »
Programación C/C++
|
niraikanai
|
10
|
6,176
|
2 Abril 2015, 07:42 am
por boy-ka
|
|
|
Enviar un mensaje de texto en formato PDU (Problema)
Dudas Generales
|
Klay
|
0
|
1,912
|
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
|
29 Septiembre 2016, 02:45 am
por soundevice
|
|