c getaddrinfo没有这样的主机是众所周知的

时间:2016-03-26 16:00:15

标签: c sockets networking http-headers

我试图通过给它提供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消息,我想在不使用任何外部库的情况下下载实际网页。

1 个答案:

答案 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>