在C(消息体)中获取HTTP请求

在C(消息体)中获取HTTP请求,c,character-encoding,http,C,Character Encoding,Http,我在以下代码中使用C发出GET请求: char buffer[1024] = "GET / HTTP/1.1\r\n" "Host: example.com\r\n" "Accept-Encoding: gzip, deflate\r\n" "Accept-Language: en-US,en;q=0.5\r\n" "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:

我在以下代码中使用C发出GET请求:

   char buffer[1024] =
        "GET / HTTP/1.1\r\n"
        "Host: example.com\r\n"
        "Accept-Encoding: gzip, deflate\r\n"
        "Accept-Language: en-US,en;q=0.5\r\n"
        "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0\r\n"
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
        "Connection: keep-alive\r\n"
        "Cache-Control: max-age=0\r\n\r\n";

   size_t buffer_len = sizeof(buffer) - 1;

   /* Send message to the server */
   n = write(sockfd, buffer, buffer_len);

   /* Now read server response */
   bzero(buffer, strlen(buffer));
   n = read(sockfd, buffer, buffer_len);

   /* Display result */
   printf("%s\n",buffer);
   return 0;
适当回应:

HTTP/1.1 200 OK
Date: Mon, 19 Sep 2016 17:20:48 GMT
Server: Apache
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 6695
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

�
除了最后一行应该是消息体,
它只显示一个符号,而不是html内容�, 有人知道问题出在哪里吗?

您告诉服务器您愿意接受压缩响应(请参阅
接受编码:gzip,deflate
),因此服务器实际上向您发送了一个gzip压缩响应(请参阅
内容编码:gzip
)。您的代码实际上不支持解压缩(您可以使用进行解压缩),因此需要从请求头中删除
Accept Encoding
。然后您将得到一个消息体未压缩的响应。

您告诉服务器您愿意接受压缩响应(请参阅
接受编码:gzip,deflate
),因此服务器实际上向您发送了一个gzip压缩响应(请参阅
内容编码:gzip
)。您的代码实际上不支持解压缩(您可以使用进行解压缩),因此需要从请求头中删除
Accept Encoding
。然后您将得到一个消息体未压缩的响应。

缓冲区有多大?看起来您需要从服务器读取至少7000个字符。您可能需要调用
read
几次。我还建议您查看Wireshark,以便使用您的代码和浏览器或netcat(已知的工作客户端)查看是否存在任何差异。注意
内容编码:gzip
在响应中。缓冲区有多大?看起来您需要从服务器读取至少7000个字符。您可能需要调用
read
几次。我还建议您查看Wireshark,以便使用您的代码和浏览器或netcat(已知的工作客户端)查看是否存在任何差异。注意
内容编码:gzip
在响应中。现在显示纯文本,事实上,这并不是全部page@IsabelCariod:您的代码根本没有尝试处理响应标题。您需要处理标题,它们告诉您响应是如何编码的,因此必须如何读取。注意
内容长度
传输编码
标题,了解需要多少字节,以及如何读取字节。有关更多详细信息,请参阅本文,了解您需要在代码中实现的阅读逻辑。现在显示纯文本,实际上它并不是全部page@IsabelCariod:您的代码根本没有尝试处理响应标题。您需要处理标题,它们告诉您响应是如何编码的,因此必须如何读取。注意
内容长度
传输编码
标题,了解需要多少字节,以及如何读取字节。有关更多详细信息,请参阅本文,了解需要在代码中实现的读取逻辑。