0

在 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

4 回答 4

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) );
    }
}
于 2015-06-02T09:23:12.047 回答
1

您可以struct in_addr使用以下命令从 a 直接转换为字符串inet_ntoa()

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

但是,您得到的值 (16777243) 看起来是错误的 - 结果是 1.0.0.27!

于 2012-05-01T19:42:47.600 回答
1

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

于 2012-05-01T19:45:46.143 回答
0

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

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

于 2019-01-19T15:32:10.367 回答