【问题标题】:How send a binary file in segments over network in C?如何在 C 中通过网络分段发送二进制文件?
【发布时间】:2011-12-31 11:32:02
【问题描述】:

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

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

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

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

但是我似乎找不到合适的功能来实现这一点。 freadfseek 闪过我的脑海,但第一个立即读取整个文件,并且使用 fseek 我看不到只从文件中获取一部分的方法(而不是从文件指针中读取直到结束文件)。

【问题讨论】:

  • 如果fread 一次读取整个文件,为什么它有参数告诉它要读取多少?而fseek根本不能用于阅读。
  • 请问为什么要分段发送?此外,sendfile 效率更高。
  • @yi_H 原因是我之前整体发过,没有整体到。我在浏览器中收到一条消息,例如“无法读取文件”
  • @Joachim 我认为只有已经知道这些功能如何工作的人才能阅读并完全理解一些手册页。

标签: c sockets binary file-transfer


【解决方案1】:

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

【讨论】:

  • 现在我明白了。但是我很好奇为什么这个函数是这样实现的,而不是立即给出number of bytes 来阅读。
  • 一个非常常见的使用模式是fread(foo, sizeof(some_complex_datastructure_t), x, fp);。我不确定是否有合理的技术原因,只是您当时谈论的是离散元素而不是字节。
【解决方案2】:

来自手册页:

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

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

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

如果您正在用 C 编写自己的网络服务器,您可能想看看libmicrohttpd,这是一个用 C 语言嵌入到其他应用程序的网络服务器,它可以为您处理流式传输文件。

【讨论】:

    【解决方案3】:

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2014-03-31
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多