2016-09-19 119 views
1

我使在下面的代码用C GET请求:GET HTTP用C请求(消息体)

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内容它只出现一个符号Does,有谁知道哪里可以解决问题?

+1

'buffer'有多大?看起来您需要从服务器读取至少7000个字符。您可能需要几次调用'read'。 –

+0

我也建议看一下Wireshark,这样你就可以准确地看到发送了什么,使用你的代码和浏览器或者netcat(一个已知的工作客户端)来查看是否有任何差异。 – yano

+2

注意响应中的“内容编码:gzip”。 –

回答

4

您告诉服务器您愿意接受压缩响应(请参阅Accept-Encoding: gzip, deflate),因此服务器实际上向您发送了gzip压缩响应(请参阅Content-Encoding: gzip)。你的代码实际上并不支持解压缩(你可以使用zlib library),所以你需要从你的请求头中删除Accept-Encoding。然后你会得到一个没有压缩的消息体的响应。

+0

现在显示纯文本,实际上它不是整个页面 –

+1

@IsabelCariod:您的代码不会尝试处理所有**响应头**。您需要处理标题,它们会告诉您响应是如何编码的,以及如何读取它。请注意'Content-Length'和'Transfer-Encoding'标题,以了解*期望的字节数*,以及*如何读取字节数。 [阅读RFC 2616第4.4节消息长度](https://tools.ietf.org/html/rfc2616#section-4.4)以获取更多详细信息,并参阅[伪代码](http://stackoverflow.com/a/7234357/65863)为您需要在您的代码中实现的阅读逻辑类型。 –