Envío de archivos con sockets

Estoy tratando de crear un servidor HTTP básico para aprender más sobre cómo funciona. Tengo dificultades para enviar archivos binarios al cliente. Mi código es el siguiente:

char * buffer = (char *)malloc(sizeof(char) * 512);
fseek(content_file, 0, SEEK_SET);
while (!feof(content_file)) {
    size_t read = fread(buffer, sizeof(char), sizeof(buffer), content_file);
    if (read > 0) {
        client->send((const void *)buffer);
    }
}
fclose(content_file);
free(buffer);

Ahora sé que puede enviar algunos datos innecesarios después de la última lectura del bloque, pero antes de intentar arreglarlo, quiero saber qué tiene de malo. Funcionaba bien para archivos de texto y estaba usando fgets. Pero después de cambiar a fread para admitir archivos binarios, los archivos de texto se corrompen y se convierten en algo como esto: ThisÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ("Esto" es la única parte correcta en los datos enviados)

Obviamente me falta algo, pero ¿podrían ayudarme a hacerlo correctamente?

Edit:

El uso de un buffer_size valor en lugar de sizeof(buffer) solucionó el problema de datos faltantes / corruptos.

preguntado el 16 de mayo de 11 a las 18:05

¿Puede mostrarnos la firma y / o el código de cleint->send? Específicamente, ¿cómo sabe cuántos bytes enviar? -

Oh, tonto de mí, estaba usando strlen en cliente-> enviar :-) Gracias, pero no puedo marcar tu comentario como solución, así que seguiré adelante y marcaré el de Bo. -

1 Respuestas

Tu problema es que sizeof(buffer) le da el tamaño del puntero, no a lo que apunta.

Agrega una buffer_size y usar eso tanto para malloc y freed.

contestado el 16 de mayo de 11 a las 23:05

Puede obtener el tamaño del archivo usando este código: fseek (fp, 0, SEEK_END); ulFileSize = ftell (fp); fseek (fp, 0, SEEK_SET); - CariElf

Gracias, CariElf. Eso es lo que estoy usando. - frbry

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.