c - 将 HTTP GET 响应与传入文件分开

标签 c http sockets get response

我正在开发一个 C 程序,该程序使用套接字通过 HTTP GET 请求检索文件。我用recv函数写入缓冲区,然后将缓冲区的内容追加到一个新文件中。该程序工作正常,但有一个问题:每个文件的顶部都包含 HTTP 响应。

例如,我可以使用我的程序从网络成功下载并打开 PDF 文件,并且打开该文件不会出现任何问题。但是,如果我在 Notepad++ 中编辑 PDF,我会在顶部看到以下内容:

HTTP/1.1 200 OK
Date: Wed, 07 Nov 2012 19:57:54 GMT
Server: Apache/2.2.21 (Unix) mod_python/3.3.1 Python/2.6.6 PHP/5.3.8
Last-Modified: Wed, 01 Aug 2012 21:31:31 GMT
ETag: "f2ae8c-4134aa-4c63b04c07df2"
Accept-Ranges: bytes
Content-Length: 4273322
Content-Type: application/pdf

%PDF-1.4
%äðíø
10 0 obj
<</Filter/FlateDecode/Length 2722>>
...

如果我使用浏览器下载 PDF 文件,则除了我的程序检索的文件顶部的 HTML 响应之外,文件都会匹配。我通过删除有问题的行并比较文件哈希值来验证这一点。

我觉得有更多优雅和正确的方法来解决这个问题。我知道在文件开始之前的 HTTP 响应之后总是有两个换行符,因此这是我提取响应的(草率的、无效的)尝试:

FILE* ptr_file = fopen("PDF_TEST.pdf", "w+");
char* buffer[BUFFER_SIZE];
int file_pos   = 0;
int bytes_rcvd = 0;
int first_iter = 1;

while((bytes_rcvd = recv(socket_server, buffer, BUFFER_SIZE, 0)) > 0)
{
    if(first_iter)
    {// Need to remove the HTTP response from the buffer
        char* str_buffer;
        char* html_resp = strstr(buffer, "\n\n");
        int   html_resp_length = strlen(html_resp) + 2;
        printf("HTML RESPONSE:\n%s\n\n", html_resp);
        char* first_buffer[BUFFER_SIZE - html_resp_length];
        memcpy(first_buffer, buffer+html_resp_length-1, sizeof(first_buffer));
        printf("\n\nREST OF BUFFER:%s\n", first_buffer);
        bytes_rcvd -= html_resp_length;
        fwrite(first_buffer, 1, bytes_rcvd, ptr_file);
        first_iter = 0;
        continue;
    }           
    fwrite(buffer, 1, bytes_rcvd, ptr_file); 
    file_pos += bytes_rcvd;
}  

我在这段代码中遇到了段错误,但我相信这是因为我的缓冲区是一个 char* 的数组。我使用它就好像它是 char大批。

我的问题:
1.) 将 HTTP 响应与文件分离的最佳方法是什么?
2.) 使用 Content-Length 是否更好由 HTML 响应指定写入文件,或者我应该使用当前的方法来写入收到的字节数?

欢迎任何意见。

最佳答案

一种方法是有两个循环:第一个循环用于响应 header ,读取直到获得空行。数据的第二个接收循环。

关于c - 将 HTTP GET 响应与传入文件分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13293713/

相关文章:

c - 访问指针数组中的数组

c++ - 在 C++ 中解析 HTTP header

delphi - 使用 Delphi 获取全文提要

c - TOR 上的基本 C Windows TCP 套接字,recv() 挂起?

c - 关闭 ARM9 (LPC3141) 上的单个 GPIO 引脚

c - 这个排序函数是如何工作的?

c - 家庭作业 - C 位谜题 - 使用 C 位操作执行 %(无循环、条件、函数调用等)

javascript - 当我使用静态站点时,如何使用 Express 处理路由?

c - 对非阻塞套接字使用 select() 进行连接总是返回 1

java - PlainDatagramSocketImpl(IOException : Operation not permitted)