Linux 通过gethostbyaddr()查找DNS信息,为啥运行结果出现segmentation fault(core dumped)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 通过gethostbyaddr()查找DNS信息,为啥运行结果出现segmentation fault(core dumped)相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])

struct hostent *ht;
struct in_addr *addr;
char *ptr;
int i=0;

if(argc!=2)

printf("wrong paramenter.");
exit(0);


ptr = argv[1];

if(inet_aton(ptr,addr)) //输入的是IP

ht = gethostbyaddr(addr,4,AF_INET);

printf("Address: %s.\n",argv[1]);
printf("Official name: %s \n", ht->h_name);
for(i=0;;i++)

if(ht->h_aliases[i]!=NULL)
printf("Aliases %d: %s \n",i,ht->h_aliases[i]);
else
break;

for(i=0;;i++)

if(ht->h_addr_list[i]!=NULL)

addr = ht->h_addr_list[i];
printf("IP address %d: %s \n",i,inet_ntoa(*addr));

else
break;


参考技术A struct in_addr *addr;

这个不能定义为支持,否则将结果保存到addr的时候出现内存溢出。
改成
struct in_addr addr;
inet_aton(ptr,&addr)

ht = gethostbyaddr(&addr,4,AF_INET);追问

这个还没有完全解决我的问题
请问怎么将ht->h_addr_list[i]中的char类型数组转变成in_addr类型呢?

追答

ht->h_addr_list[i]是个网络序的ip地址表示,与struct in_addr
的内存表示一致,可以直接转换。

printf("IP Address :%s",inet_ntoa(*((struct in_addr *)ht->h_addr_list[i])));

Python 从 IP 查找主机名,超时 1 秒

【中文标题】Python 从 IP 查找主机名,超时 1 秒【英文标题】:Python lookup hostname from IP with 1 second timeout 【发布时间】:2011-02-04 06:26:24 【问题描述】:

如何在给定 IP 地址的情况下查找主机名?此外,如果不存在这样的反向 DNS 条目,我如何指定超时?试图让事情尽可能快。或者,还有更好的方法?谢谢!

【问题讨论】:

【参考方案1】:
>>> import socket
>>> socket.gethostbyaddr("69.59.196.211")
('***.com', ['211.196.59.69.in-addr.arpa'], ['69.59.196.211'])

为了实现函数的超时,this *** thread 对此有答案。

【讨论】:

像 'http:/1.0.1.0/blah/blahm.html' 这样的东西呢? @Eiyrioü von Kauyf:这不是问题所在(指定 IP 地址时返回主机名)。 这是同一个问题 - 但是我问你有没有建议的方法来规范化它并执行 socket.gethostbyaddr("1.0.1.0") 之类的?这是同一个问题,但输入格式不同 - gethostbyaddr 不喜欢非规范化输入。 @EiyrioüvonKauyf 是的,因为它正是该方法应该做的:ip 到 dns 的转换......你可以使用像 http(|s)://([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/.* 这样的正则表达式。还有更多,更好或更精确的 socket 有自己的方法来设置超时时间:docs.python.org/2/library/socket.html#socket.socket.settimeout【参考方案2】:

您尝试完成的操作称为反向 DNS 查找。

socket.gethostbyaddr("IP") 
# => (hostname, alias-list, IP)

http://docs.python.org/library/socket.html?highlight=gethostbyaddr#socket.gethostbyaddr

但是,对于超时部分,我读到有人遇到过这个问题。我会查看PyDNS 或this 解决方案以获得更高级的治疗。

【讨论】:

以上是关于Linux 通过gethostbyaddr()查找DNS信息,为啥运行结果出现segmentation fault(core dumped)的主要内容,如果未能解决你的问题,请参考以下文章

gethostbyname和gethostbyaddr

从IP地址获取主机名

php怎样通过IP获取应对的域名?

Python 从 IP 查找主机名,超时 1 秒

gethostbyname与DNS

ubuntu通过find的命令查找包的位置