簡體   English   中英

通過 URL 獲取 IP 地址

[英]Get IP-address by URL

這有效

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

但我想從網站 URL 中獲取 IP

我努力了

const char host[] = "http://www.google.com/";
struct hostent *host_ip;
host_ip = gethostbyaddr(host, strlen(host), 0);

我在使用 gethostbyaddr() 之前做過 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

inet_addr()接受 IPv4 地址字符串作為輸入並返回該地址的二進制表示。 在這種情況下,這不是您想要的,因為您沒有 IP 地址,而是有一個主機名。

您使用gethostby...()在正確的軌道上,但您需要使用gethostbyname() (按主機名查找)而不是gethostbyaddr() (按 IP 地址查找) 1 並且您不能將完整的 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順便說一句,不推薦使用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
    ...

嘗試使用 getaddrinfo。 這里有一個使用它的快速指南: http : //beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM