Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过URL获取IP地址_C_Sockets_Tcp_Network Programming - Fatal编程技术网

C 通过URL获取IP地址

C 通过URL获取IP地址,c,sockets,tcp,network-programming,C,Sockets,Tcp,Network Programming,这很有效 target.sin_addr.s_addr = inet_addr("127.0.0.1"); 但我想把IP从一个网站的URL 我试过了 const char host[] = "http://www.google.com/"; struct hostent *host_ip; host_ip = gethostbyaddr(host, strlen(host), 0); 在我使用gethostbyaddr()之前,corse的我做了WSAStartup 我试过这个 target

这很有效

target.sin_addr.s_addr = inet_addr("127.0.0.1");
但我想把IP从一个网站的URL

我试过了

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;

尝试使用getaddrinfo。这里有一个使用它的快速指南:

inet\u 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
    ...

请将您的完整代码缩减为a,并将其张贴在您的问题中。因为它在堆栈溢出时是无用的和离题的。我在谷歌上搜索了“nslookup源代码”,并被发送到()。我不知道,可能其他来源更好。谷歌是你在这里的朋友。;-)这是完整的代码,如果你想看的话,网上有很多相关的资源。“当然”你已经试过了,但没用。没有必要在这里重复它们;标准::cout h_addr;它给了我httpa104-116-116-112.deploy.static.akamaitechnologies.com
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
    ...