如何使用 C 中的套接字将大文件发送到浏览器?

how to send a large file to browser using socket in C?

我正在用 C 语言编写一个简单的 Web 服务器,我想将大约 17KB 的图像发送到浏览器。我正在尝试使用 send() 函数来实现,但我定义的缓冲区只有 4096,我不想更改 it.So 我想将图像分成字节块来发送,但浏览器只是似乎收到响应 header 并且图像无法 load.And 如果我将 BUF_SIZE 更改为 1024*32 并发送所有图像,它将起作用。

发送图片应该怎么做?如果你能给我一个建议,我将不胜感激。 我的代码如下:

#define BUF_SIZE 4096
char buf[BUF_SIZE];
readret=sprintf(buf,"HTTP/1.1 200 OK\r\n"
        "Content-Length: %ld\r\n"
        "Content-type: image/png"
        "Accept-Ranges: bytes\r\n\r\n");

FILE *fp=fopen(file,"rb");
if (send(client_sock, buf, readret, 0) != readret){
    close_socket(client_sock);
    close_socket(sock);
    fprintf(stderr, "Error sending to client.\n");
    return EXIT_FAILURE;
}
if(fp){
    while((readret=fread(buf,sizeof(unsigned char),BUF_SIZE,fp))>0){
            if (send(client_sock, buf, readret, 0) != readret){
            close_socket(client_sock);
            close_socket(sock);
            fprintf(stderr, "Error sending to client.\n");
            return EXIT_FAILURE;
        }
    }
    fclose(fp);
}

浏览器如下:

The response header of the image

the image can't load

编辑 2022/3/25

我错误地删除了 %ld 的参数,抱歉

我明白了原因:

我不小心在每个块的末尾添加了一个空格。换句话说,图像的数据是错误的。谢谢大家!