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;
这个不能定义为支持,否则将结果保存到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)的主要内容,如果未能解决你的问题,请参考以下文章