GET请求获取页面内容

时间:2017-09-15 03:08:26

标签: c networking winsock get-request

我正在尝试执行与python相同的C语言: requests.get('http://test.com')

我首先使用getaddrinfo()解析主机名(它有4个ips)到ip然后server.sin_addr.s_addr = inet_addr(ip);并且它成功连接(不会给出错误)。但是当我尝试通过发送"GET / HTTP/1.1\r\n\r\n请求来显示页面时,它基本上会返回404错误(找不到页面)内容。这是功能:

void foo ()
{
    struct addrinfo     hints;
    struct addrinfo     *result = NULL;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family     = AF_UNSPEC;
    hints.ai_socktype   = SOCK_STREAM;
    hints.ai_protocol   = IPPROTO_TCP;

    char host[256], port [256];
    strcpy(host, "www.test.com");
    strcpy(port, "80");
    getaddrinfo(host, port, &hints, &result);

    struct sockaddr_in  *sockaddr_ipv4 = (struct sockaddr_in *)result->ai_addr;
    char ip [256];
    strcpy(ip, inet_ntoa(sockaddr_ipv4->sin_addr));

    struct sockaddr_in server;
    SOCKET s = socket(AF_INET , SOCK_STREAM , 0 );
    char *message , server_reply[2000];
    int recv_size;

    server.sin_addr.s_addr = inet_addr(ip);
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }
    message = "GET / HTTP/1.1\r\n\r\n";
    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }
    server_reply[recv_size] = '\0';
    puts(server_reply);*/
    system("PAUSE");
}

结果

  

HTTP / 1.1 404未找到日期:星期五,2017年9月15日03:19:41 GMT   内容类型:text / html; charset = UTF-8服务器:ghs内容长度:   1561 X-XSS-Protection:1; mode = block X-Frame-Options:SAMEORIGIN

     

错误404(未找到)!! 1
          {margin:0; padding:0} html,代码{font:15px / 22px arial,sans-serif} html {backgrou   nd:#fff;颜色:#222;填充:15px} body {margin:7%auto   0;最大宽度:390px;最小高度:180px;填充:30px 0 15px} &gt;   body {background:url(// www.google.com/images/error s / robot.png)100%   5px no-repeat; padding-right:205px} p {margin:11px 0 22px; overflo   w:hidden} ins {color:#777; text-decoration:none}一个img {border:0} @media   屏幕和(m   AX-宽度:772px){体{背景:无;边距:0;最大宽度:无;填充右:0   }}#标志{背景:网址(// www.google.com/images/branding/googlelogo/1x/googlelogo   _color_150x54dp.png)no-repeat; margin-left:-5px} @media only screen and(min-reso   lution:192dpi){#标志{背景:网址(// www.google.com/images/branding/googlelogo/   2x / googlelogo_color_150x54dp.png)无重复0%0%/ 100%   100%; - MOZ边界图像:UR   升(// www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png)   0}} @ media only screen and   (-webkit敏设备像素比:2){#标志{背景:乌尔   升(// www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png)   不重复; -webkit-背景尺寸:100%   100%}} #logo {display:inline-block; height:5 4px; width:150px}       

404。 Thata?Ts错误。

请求的网址   在此服务器上找不到/。综合类?我们所有人   知道。

我做错了什么?我该如何处理?

1 个答案:

答案 0 :(得分:3)

在HTTP / 1.1中,您需要指定Host标头。在HTTP / 1.0中你没有。因此,您必须将其更改为:

 GET / HTTP/1.0\r\n\r\n

 GET / HTTP/1.1\r\n
 Host: the.hostname.com\r\n\r\n

由于虚拟主机名变得如此普遍,因此进行了此更改。