Unix - 如何获取域名的IP地址?

时间:2012-05-01 19:38:19

标签: c unix localhost hosts-file

在UNIX的C程序中,gethostbyname()可用于获取域名地址,如“localhost”。如何将结果从gethostbyname()转换为点分十进制表示法。

struct hostent* pHostInfo;
long nHostAddress;

/* get IP address from name */
pHostInfo=gethostbyname("localhost");

if(!pHostInfo){
    printf("Could not resolve host name\n");
    return 0;
}

/* copy address into long */
memset(&nHostAddress, 0, sizeof(nHostAddress));
memcpy(&nHostAddress,pHostInfo->h_addr,pHostInfo->h_length);

nHostAddress包含以下内容:

16777243

如何转换结果以便输出为:

127.0.0.1

4 个答案:

答案 0 :(得分:2)

inet_ntoa() API可以满足您的需求,但显然已被弃用:

https://beej.us/guide/bgnet/html/multi/inet_ntoaman.html

如果你想要一些更具前瞻性的IPV6ish,那就是inet_ntop()

https://beej.us/guide/bgnet/html/multi/inet_ntopman.html

答案 1 :(得分:2)

很容易编译此代码

#include<stdio.h>
#include<netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
    struct hostent *ghbn=gethostbyname("www.kamonesium.in");//change the domain name
    if (ghbn) {
        printf("Host Name->%s\n", ghbn->h_name);
        printf("IP ADDRESS->%s\n",inet_ntoa(*(struct in_addr *)ghbn->h_name) );
    }
}

答案 2 :(得分:1)

您可以使用struct in_addr直接将inet_ntoa()转换为字符串:

char *address = inet_ntoa(pHostInfo->h_addr);

你得到的价值(16777243)看起来不对 - 这是1.0.0.27!

答案 3 :(得分:0)

最后一条语句中的变量“ h_name ”需要更改为“ h_addr ”,如下所示:

printf(“ IP地址->%s \ n”,inet_ntoa(*(struct in_addr *)ghbn-> h_addr));