http c客户端套接字中出现301/302错误

时间:2014-08-14 08:44:10

标签: c sockets http

我正在制作一个http c客户端套接字。到目前为止,我已经创建了一个自定义URL解析器,现在问题是连接到绝对URL。该程序适用于相对URL但不是绝对的。

以下是绝对和相对网址结果的示例输出:

绝对网址:http://www.google.com

enter image description here

相对网址:http://techpatterns.com/downloads/firefox/useragentswitcher.xml

enter image description here

在绝对网址中,它提供301/302状态代码,而在相对网址中,状态为200 OK

以下是关键区域的示例代码

char ip[100],*path, *domain, *abs_domain, *proto3;
char *user_agent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0";
char *accept_type = "Accept: text/html, application/xhtml+xml, */*\r\nAccept-Language: en-US\r\n";
char *encoding = "Accept-Encoding: gzip, deflate\r\n";
char *proxy_conn = "Proxy-Connection: Keep-Alive\r\n";
char hostname[1000];

 url:
fgets(hostname,sizeof(hostname), stdin);
for(i=0; i<strlen(hostname);i++){//remove new line
    if(hostname[i]=='\n'){
        hostname[i]='\0';
    }
}

proto3 = get_protocol(hostname); //get protocol i.e. http, ftp, etc
//get domain ie http://mail.google.com/index -> mail.google.com
//http://www.google/com/ssl_he -> www.google.com
domain = get_domain(hostname);  
if(strlen(domain)==0){
    printf("invalid url\n\n");
    goto url;
}

abs_domain = get_abs_domain(hostname);//gets abs domain google.com, facebook.com etc
path = get_path(hostname);

//getting the ip address from the hostname
if ( (he = gethostbyname( abs_domain ) ) == NULL)
{
    printf("gethostbyname failed : %d" , WSAGetLastError());
    goto url;
}

//Cast the h_addr_list to in_addr , since h_addr_list also has the ip address in long format only
addr_list = (struct in_addr **) he->h_addr_list;

for(i = 0; addr_list[i] != NULL; i++)
{
    //Return the first one;
    strcpy(ip , inet_ntoa(*addr_list[i]) );
}

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


sprintf(sendbuf, "GET /%s HTTP/1.1\r\n%sUser-Agent: %s\r\nHost: %s\r\n\r\n", path,accept_type,user_agent, abs_domain);

简要说明代码:

即。如果用户输入的网址为http://mail.deenze.com/control_panel/index.php

协议将是 - &gt; http

域名将是 - &gt; mail.deenze.com

abs_domain将是 - &gt; deenze.com

路径为control_panel/index.php

最后,这个值与用户代理一起用于发送数据。

2 个答案:

答案 0 :(得分:3)

301 and 302 status codes are redirects,不是错误。它们表示您应该在不同的URL处尝试请求。

在这种情况下,尽管您输入了网址http://www.google.com/,但您发送的Host标题只包含google.com。 Google会向您发送重定向信息,告知您改为使用www.google.com

我注意到你似乎有一个get_abs_domain函数正在剥离www;没有理由你应该这样做。 www.google.comgoogle.com是不同的主机名,可能会为您提供完全不同的内容。在实践中,大多数网站会为您提供相同的结果,但您不能依赖于此;有些会从一个重定向到另一个,有些会简单地提供相同的内容,有些可能只在一个或另一个工作。

不应该尝试将其中一个重写为另一个,而应该遵循您返回的任何重定向。

我建议使用现有的HTTP客户端库,而不是尝试编写自己的(除非这只是您自己的启发练习)。例如,如果你想要便携,可以cURLHttpClient如果你只需要在Windows上工作(基于你的屏幕截图,我假设这是's}您正在使用的平台)。编写一个可以实际处理大部分Web的HTTP客户端有很多复杂性; SSL,压缩,重定向,分块传输编码等。

答案 1 :(得分:0)

@Brian Campbell,我认为问题是www,因为如果我使用www.google.com它给了我一个重定向网址:https://www.google.com/?gws_rd=ssl和我的浏览器相同,但因为它是https我认为我将不得不使用ssl,谢谢你的回答 我不能复制粘贴我的终端中的文本,但我已增加字体以实现可见性

enter image description here