gethostbyaddr() returns null
gethostbyaddr() returns null
我知道这个问题以前在这里被问过,我阅读了所有的答案,但无法独自解决。交易如下:我必须制作一个程序,获取一堆互联网地址(如谷歌网站、www.root.cz),并打印出正式名称、替代名称、IP地址和别名的域名。我们有一个没有别名域名的1个地址的示例代码,所以我使用了它,然后做了一些更改以满足我的需求。代码如下:
#include <iostream>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main (int argc, char *argv[])
{
for (int i = 1; i < argc; ++i){
hostent *H = gethostbyname(argv[i]);
if (H == NULL)
{
std::cerr << "Nepodařilo se zjistit adresu" << std::endl;
return -1;
}
std::cout << "Oficiální jméno: " << H->h_name << std::endl;
std::cout << "Alternativy: " << std::endl;
/* Budeme procházet pole H->h_aliases. Pole je ukončené NULL.*/
char **alternativy = H->h_aliases;
while(*alternativy != NULL)
{
std::cout << "t" << *(alternativy++) << std::endl;
}
/* Budeme procházet pole H->h_addr_list. Pole je ukončené NULL.
Zvolíme jiný postup než v předchozím případě.*/
std::cout << "Adresy: " << std::endl;
for(int i = 0; H->h_addr_list[i] != NULL; ++i)
{
/* H->h_addr_list je binární forma IP adresy. Pro převod na
tečkovou konvenci použijeme inet_ntoa.*/
const char* addr = inet_ntoa(*(in_addr *)H->h_addr_list[i]);
hostent *name = gethostbyaddr(addr, sizeof(addr), AF_INET);
std::cout<<addr<<"->"<<name<<std::endl;
}
std::cout<<std::endl;
}
return 0;
}
一切都很好。唯一名称始终为null。我试着在我的笔记本电脑和虚拟Debian Squeeze上的ubuntu 12.04上运行这个(不记得数字了)。我检查了前面问题中提到的一些配置文件。还尝试配置更多DNS服务器。什么都不管用。我也尝试过使用getnameinfo,但由于某些原因,它总是只返回给定的IP地址。任何帮助都将不胜感激。
您传递了错误的IP格式,要将其转换回主机名。
把你的换成这样。
for(int i = 0; H->h_addr_list[i] != NULL; ++i)
{
/* H->h_addr_list je binární forma IP adresy. Pro převod na tečkovou konvenci použijeme inet_ntoa.*/
const char* addr = inet_ntoa(*(in_addr *)H->h_addr_list[i]);
hostent *name = gethostbyaddr((in_addr *)H->h_addr_list[i], sizeof(in_addr), AF_INET);
std::cout<<addr<<"->"<<name->h_name<<std::endl;
}
也要查找getaddrinfo()
,因为gethotbyname(),gethostbyaddr()
是过时的函数
使用不正确的参数调用gethostbyaddr()时出错(它需要一个二进制地址,而不是字符串),另一个错误显示返回的名称(这是hostent的一个字段)。我尝试了以下方法,似乎效果良好:
hostent *name = gethostbyaddr(H->h_addr_list[i], sizeof (struct in_addr), AF_INET);
std::cout << addr << "->" << name->h_name << std::endl;
相关文章:
- gdk_screen_get_default() returns null
- FindClass returns null
- SDL_ttf TTF_OpenFont returns NULL
- PKCS7_sign returns null
- C++ CreateWindowEx returns NULL
- wglGetProcAddress returns NULL
- cvCaptureFromCAM(CV_CAP_ANY) returns NULL
- gethostbyaddr() returns null
- glfwCreateWindow returns NULL
- CreateWindowEx returns NULL
- CreateFileMapping() returns null
- C++ LoadLibrary Returns Null
- Jni FindClass returns NULL
- SDL/TTF: TTF_RenderText_Blended_Wrapped returns NULL
- osg::GraphicsContext::WindowingSystemInterface returns null
- JNI- FindClass returns null
- VFW: AVIStreamGetFrameOpen() returns NULL
- engOpen returns Null
- avformat_alloc_context returns null
- TinyXML2 returns Null?