Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 11 Octubre 2012, 15:24 pm



Título: Problema con sprintf()
Publicado por: soyloqbuskas en 11 Octubre 2012, 15:24 pm
¡Buenas a todos!

Tengo un problemilla con sprintf(). El problema esta en que me duplica la cadena y no coge bien las variables....

Esta es la funcion:
Código
  1. char * httpPacket(char *httpDatos){
  2.  
  3.        char packet[65536]={""};
  4.        sprintf(packet,"HTTP/1.1 200 OK\r\nDate: Thu, 22 Mar 2012 02:02:42 GMT\r\nContent-Type: text/html; charset-UTF-8\r\nContent-Encoding: gzip\r\nContent-Lengh: %d\r\nServer: gws\r\n\r\n%s",sizeof(httpDatos), httpDatos);
  5.        printf("paquete: %s\n",packet);
  6.        return (char *) packet;
  7.  
  8. }

La variable httpDatos contiene codigo html...

Y el printf(packet) tiene como salida esto:

Citar
paquete: HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 4
Server: gws

HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 4
Server: gws



Cuando en realidad deberia ser asi:

Citar
paquete: HTTP/1.1 200 OK
Date: Thu, 22 Mar 2012 02:02:42 GMT
Content-Type: text/html; charset-UTF-8
Content-Encoding: gzip
Content-Lengh: 34
Server: gws

<html>
     <h1>Prueba</h1>
</html>

Si os fijais, duplica la cabecera, pone mal el campo Content-Length y no muestra el codigo html...

¿Donde esta el fallo?


Título: Re: Problema con sprintf()
Publicado por: rir3760 en 11 Octubre 2012, 16:54 pm
Revisando la función hay tres errores.

El primero es utilizar '{""}' para inicializar el array. En su lugar se debe utilizar "" o bien {'\0'}. Por ejemplo:
Código
  1. char packet[65536] = ""; /* "" o {'\0'}; */

El segundo es utilizar la dirección en memoria de una variable local (el array "packet") como valor de retorno de la función. Las variables locales se destruyen (la memoria utilizada por ellas se libera) justo al terminar la función. Para solucionarlo debes calificar con "static" al array o bien reservar memoria mediante la función "malloc". Un ejemplo de esto ultimo:
Código
  1. char *httpPacket(char *httpDatos)
  2. {
  3.   char *packet = malloc(65536);
  4.  
  5.   /* ... */

El ultimo es lógico: esperas que "sizeof(httpDatos)" resulte en el numero de caracteres de la cadena pasada como argumento. No es así, utilizar dentro de la función "sizeof(httpDatos)" es lo mismo que "sizeof(char *)" y por eso resulta en cuatro (ese es el tamaño del puntero en tu SO). La solución aquí es agregar otro parámetro y pasar "manualmente" el numero de caracteres o bien llamar a la función "strlen" para que ella haga el trabajo.

Por ultimo el error que mencionas sobre la cadena duplicada es difícil de explicar (me refiero a encontrarle una causa), te recomendaría que antes de llamar a la función verifiques el contenido de la cadena empezando por revisar que incluya el carácter terminador '\0'.

Un saludo


Título: Re: Problema con sprintf()
Publicado por: soyloqbuskas en 12 Octubre 2012, 02:47 am
Muchas gracias por las aclaraciones, enseguida me pondre a corregir.

Un saludo.