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

时间:2011-11-17 15:40:37

标签: c sockets binary file-transfer

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

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

我对如何实现这一点感到有些失落。这就是我想要的东西

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

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

3 个答案:

答案 0 :(得分:3)

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(反之亦然),并只读取文件的该部分。

答案 1 :(得分:2)

从手册页:

  

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

     

函数fread() stream 指向的流中读取 nmemb 数据元素,每个 size 字节长,将它们存储在 ptr 给出的位置。

如您所见,您不必使用fread阅读整个文件,您可以在 nmemb 大小的块中阅读。

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

答案 2 :(得分: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;
    }
}