gethostbyaddr()返回NULL但是errno导致SUCCESS

时间:2015-05-05 17:08:17

标签: c sockets

代码如下:

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)???

2 个答案:

答案 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)