首页 文章

如何在C中通过网络分段发送二进制文件?

提问于
浏览
0

我对如何将文件从http服务器发送到客户端(Web浏览器)感到有些困惑 .

首先我发送 Headers ,我的下一个任务是发送文件内容 . 但是,当我遇到一些问题时,我想一次性发送512字节的段而不是整个文件 .

我对如何实现这一点感到有点迷茫 . 这就是我想要的

read file1;
while (seg=get_next_segment(file1)){
  do
    send(seg)
  until (seg_is_sent)
}

但是,我似乎无法找到适当的功能来实现这一目标 . freadfseek 穿过我的脑海,但是第一个一次读取整个文件并且用fseek我没有看到从文件中抓取一部分的方法(而不是从文件指针读取直到文件结尾) .

3 回答

  • 2

    fread 没有读完整个文件 . 它准确读取你告诉它读多少 .

    size_t
     fread(void *restrict ptr, size_t size, size_t nitems,
         FILE *restrict stream);
    
     size_t
     fwrite(const void *restrict ptr, size_t size, size_t nitems,
         FILE *restrict stream);
    

    这两个函数都有一个大小和 nitems . 您可以将大小设置为512,将项目数设置为1(反之亦然),并只读取文件的该部分 .

  • 3

    从手册页:

    size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);函数fread()从流指向的流中读取数据的nmemb元素,每个数据字节长,将它们存储在ptr给定的位置 .

    如您所见,您不必使用 fread 读取整个文件,您可以用nmemb大小的块读取它 .

    如果您在C中编写自己的Web服务器,您可能需要查看libmicrohttpd,它是C中用于嵌入其他应用程序的Web服务器,它可以为您处理流式传输文件 .

  • 1

    我感觉很亲切...这样的事情怎么样:

    for (;;)
    {
        char buffer[512];
        size_t nread = fread(buffer, sizeof(char), 512, fp);
        if (nread > 0)
            send_to_socket(buffer, nread);
    
        if (nread < 512)
        {
            if (feof(fp))
                printf("End of file\n");
            if (ferror(fp))
                printf("Error reading\n");
            break;
        }
    }
    

相关问题