C ++通过URL获取IP

时间:2015-09-17 20:36:42

标签: c sockets tcp network-programming

这有效

target.sin_addr.s_addr = inet_addr("127.0.0.1");

但我想从网站网址中提取IP

我试过了

const char host[] = "http://www.google.com/";
struct hostent *host_ip;
host_ip = gethostbyaddr(host, strlen(host), 0);
在我使用gethostbyaddr()之前,我的corse做了WSAStartup;

我试过这个

target.sin_addr.s_addr = inet_addr(host_ip);

我也试过了几个同样的,但它不起作用。 有人可以告诉我如何正确地做到这一点。

谢谢!

编辑:

当我这样做时

host_ip = gethostbyaddr((char *)&host, strlen(host), 0);
std::cout << host_ip->h_addr;

它给了我

httpa104-116-116-112.deploy.static.akamaitechnologies.com

2 个答案:

答案 0 :(得分:1)

inet_addr()接受IPv4地址字符串作为输入,并返回该地址的二进制表示。在这种情况下,这不是您想要的,因为您没有IP地址,而是拥有主机名。

您使用gethostby...()走在正确的轨道上,但您需要使用gethostbyname()(按主机名查找)而不是gethostbyaddr()(按IP地址查找) 1 < / SUP>。并且您无法将完整的URL传递给其中任何一个。 gethostbyname()只接受主机名作为输入,因此您需要解析URL并提取其主机名,然后您可以执行以下操作:

const char host[] = ...; // an IP address or a hostname, like "www.google.com" by itself
target.sin_addr.s_addr = inet_addr(host);
if (target.sin_addr.s_addr == INADDR_NONE)
{
    struct hostent *phost = gethostbyname(host);
    if ((phost) && (phost->h_addrtype == AF_INET))
        target.sin_addr = *(in_addr*)(phost->h_addr);
    ...
}
else
    ...

1 BTW,gethostby...()函数已弃用,请改用getaddrinfo()getnameinfo()

const char host[] = ...; // an IP address or a hostname, like "www.google.com" by itself

addrinfo hints = {0};
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

addrinfo *addr = NULL;

int ret = getaddrinfo(host, NULL, &hints, &addr);
if (ret == EAI_NONAME) // not an IP, retry as a hostname
{
    hints.ai_flags = 0;
    ret = getaddrinfo(host, NULL, &hints, &addr);
}
if (ret == 0)
{
    target = *(sockaddr_in*)(addr->ai_addr);
    freeaddrinfo(addr);
    ...
}
else
    ...

答案 1 :(得分:0)

尝试使用getaddrinfo。这里有一个使用它的快速指南:http://beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html