我试图通过给它提供http(s)前缀来使用getaddrinfo,它不能正确查找主机。我该如何解决这个问题。我想查找https://www.google.com,但gai_strerror()
返回“没有这样的主机已知”,它可以在端口80上用于www.google.com。
这是我用于getaddrinfo()部分的代码的一部分:
// The GET request I pose to download the webpage
char *send_buf="GET / \r\n";
// i tried three different urls apparently changing the value in the
// value in the variable in my code, it only works for 'www.google.com'
const char *URL="https://www.google.com";
const char *URL="http://www.google.com";
const char *URL="www.google.com";
if( ( status=getaddrinfo(URL, PORT, &hints, &res) )!=0 )
{
printf("%s\n", gai_strerror(status));
exit(1);
}
我正在尝试使用winsock2下载网页,当我使用www.google.com时,它会给我一条302 Moved消息,我想在不使用任何外部库的情况下下载实际网页。
答案 0 :(得分:2)
您必须提供所需主机的IP地址或主机名。如果您提供主机名,则它将被转换为其各自的IP地址。主机名应仅为此格式:
"www.example.domain_name"
。不要包含"http://"
或"https://"
。
这是包含主机名的URL的属性,它不是主机名本身的一部分。
要下载https://www.google.com
的HTML,您必须查找www.google.com
的IP,然后在端口443(默认HTTPS端口)上连接到该IP,然后协商SSL / TLS加密会话,然后最终发送GET
文档的HTTP /
请求。
手动实施SSL / TLS加密并不明智。在现有套接字代码之上使用诸如OpenSSL之类的库或Microsoft自己的CryptoAPI。或者,根本不要直接使用套接字API,使用HTTP / S库(如Microsoft自己的WinInet / WinHTTP API)或libcurl等库来处理所有细节。< / p>