代码如下:
struct sockaddr_in ipv4addr;
ipv4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
struct hostent *he;
he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET);
if(he)
printf("Host name: %s\n", he->h_name);
else
printf("Error AHAHA:%s\n", strerror(errno));
但它清楚地说明了
返回值
gethostbyname()和gethostbyaddr()函数返回hostent 如果发生错误,则为结构或NULL指针。出错,h_errno 变量包含错误号。当非NULL时,返回值可以 指向静态数据,请参阅下面的注释。
这段代码会导致打印错误AHAHA:SUCCESS ,这也意味着它会遇到else,这表示他 NULL 哪个不应该。
更新:
memset(&ipv4addr,0,sizeof(ipv4addr));
ipv4addr.sin_family = AF_INET;
添加这些我以某种方式得到
的主机名ANantes-651-1-49-net.w2-0.abo.wanadoo.fr(2.0.0.0)???
答案 0 :(得分:3)
正如其他人在评论中所述,gethostby...()
函数将错误代码分配给h_errno
而不是errno
。它们不是同一件事!您还可以使用gethostbyaddr_r()
来获取错误代码。但无论如何,使用hstrerror()
代替strerror()
来报告错误消息。
您也没有填充sockaddr_in.sin_family
字段。这就是代码使用inet_pton()
的原因。即使gethostbyaddr()
将一个族作为输入参数,您仍然必须将正确填充的sockaddr_in
传递给它,以便它可以验证您确实传递了IPv4地址而不是其他地址类型,如IPv6
试试这个:
struct sockaddr_in ipv4addr;
memset(&ipv4addr, 0, sizeof(ipv4addr));
ipv4addr.sin_family = AF_INET;
ipv4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
struct hostent *he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET);
if(he)
printf("Host name: %s\n", he->h_name);
else
printf("Error AHAHA:%s\n", hstrerror(h_errno));
答案 1 :(得分:1)
我仍然不知道为什么我会获得其他主机名,但这对我有用
char ipv4addr[sizeof(struct in_addr)];
inet_pton(AF_INET, "127.0.0.1", ipv4addr);
struct hostent *he;
he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET);
if(he)
printf("Host name: %s\n", he->h_name);
else
printf("Error AHAHA:%s\n", hstrerror(h_errno));
是的,我将 strerror(错误)更改为 hstrerror(h_errno)