我正在制作一个http c客户端套接字。到目前为止,我已经创建了一个自定义URL解析器,现在问题是连接到绝对URL。该程序适用于相对URL但不是绝对的。
以下是绝对和相对网址结果的示例输出:
相对网址:http://techpatterns.com/downloads/firefox/useragentswitcher.xml
在绝对网址中,它提供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
最后,这个值与用户代理一起用于发送数据。
答案 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.com
和google.com
是不同的主机名,可能会为您提供完全不同的内容。在实践中,大多数网站会为您提供相同的结果,但您不能依赖于此;有些会从一个重定向到另一个,有些会简单地提供相同的内容,有些可能只在一个或另一个工作。
不应该尝试将其中一个重写为另一个,而应该遵循您返回的任何重定向。
我建议使用现有的HTTP客户端库,而不是尝试编写自己的(除非这只是您自己的启发练习)。例如,如果你想要便携,可以cURL或HttpClient如果你只需要在Windows上工作(基于你的屏幕截图,我假设这是's}您正在使用的平台)。编写一个可以实际处理大部分Web的HTTP客户端有很多复杂性; SSL,压缩,重定向,分块传输编码等。
答案 1 :(得分:0)