我对如何将文件从http服务器发送到客户端(网络浏览器)感到有些困惑。
首先我发送标题,我的下一个任务是发送文件内容。但是,当我遇到一些问题时,我想一次性发送512字节的段而不是整个文件。
我对如何实现这一点感到有些失落。这就是我想要的东西
read file1;
while (seg=get_next_segment(file1)){
do
send(seg)
until (seg_is_sent)
}
然而,我似乎无法找到适当的功能来实现这一目标。 fread
和fseek
穿过我的脑海,但是第一个一次读取整个文件并且用fseek我没有看到从文件中抓取一部分的方法(而不是从文件中读取)指针直到文件结尾。)
答案 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;
}
}