2015-11-17 114 views
1

我是互联网编程的新手,我试图使用gethostbyname函数。当我输入一个字符串,如“www.yahoo.com”gethostbyname函数它工作正常,但是当我输入一个字符数组时,它将始终返回null。gethostbyname()函数返回null

char hostname[100]; 
    struct hostent* h; 
    gethostname(hostname, sizeof hostname); 
    printf("Hostname: %s\n", hostname); 
    h = gethostbyname(hostname); 

任何想法如何解决这个问题?

+0

'gethostname()'是否返回有效的主机名?您不检查错误的返回值。无论如何,调用'gethostbyname()'来调用'gethostname()'所报告的主机名是没有意义的。这是检索本地计算机IP地址的常见错误指导方式。您应该使用'GetAdaptersInfo' /'GetAdaptersAddresses'(Windows),'getifaddrs()'(* Nix)或其他类似平台特定的函数直接枚举本地接口。 –

+0

是的,gethostname返回正确的主机名,但gethostbyname总是返回null。 –

+0

你真的想完成什么? 'gethostbyname()'执行DNS查找。根据您计算机的DNS设置,使用'gethostname()'报告的主机名不能保证返回有效的DNS结果。在某些平台上,使用本地主机名调用'gethostbyname()'将返回结果,在某些平台上不会。如果失败,请检查'WSAGetLastError()'/'h_errno'来找出原因。在任何情况下,反正'gethostbyname()'都不推荐使用,您应该使用'getaddrinfo()'代替。 –

回答

0

在Linux程序员手动的函数具有以下声明:

struct hostent *gethostbyname(const char *name); 

这意味着该参数必须是一个字符数组(或字符串在外行而言)。在调用函数时,可以直接使用带引号的字符串,例如“yahoo.com”。

下面的代码是对的gethostbyname如何工作的工作例如:

#include <stdio.h> 
#include <string.h> 
#include <netdb.h> 

int main(){ 
    struct hostent* h=gethostbyname("yahoo.com"); 
    printf("Hostname: %s\n", h->h_name); 
    printf("Address type #: %d\n", h->h_addrtype); 
    printf("Address length: %d\n", h->h_length); 

    char text[50]; // allocate 50 bytes (a.k.a. char array) 
    strcpy(text,"bing.ca"); //copy string "bing.ca" to first 7 bytes of the array 
    h=gethostbyname(text); //plug in the value into the function. text="bing.ca" 
    printf("Hostname: %s\n", h->h_name); 
    printf("Address type #: %d\n", h->h_addrtype); 
    printf("Address length: %d\n", h->h_length); 

    return 0; 
} 

我把它叫做两次。一次为yahoo.com,一次为bing.ca,我检索了主机名,地址类型号码和地址长度(这是存储IP所需的字节数)。

对于调用bing地址,我分配了一个char数组,填充一个字符串,然后将该char数组作为参数传递给该函数。

+0

那么这是gethostname的问题呢?在我的情况下,我不知道我的主机名,所以我不能将它硬编码到一个char数组中。当我用gethostname尝试你的代码时,它仍然返回null。 –

+0

您的代码运行在(虚拟?)机器上吗?您可以从'gethostname()'中获取值,并将值(第一个参数为gethostname函数)直接插入到'gethostbyname()'中,就像您在代码中显示的内容一样,但在“sizeof” 。但是,我正在最终猜测你的网络质量在功能执行时很差。 – Mike

+0

是的,我的网络连接正常。那么,当你将gethostname添加到你的代码时,它是否工作? –

0

您的服务器无法自行解析。 “固定”这种最常见的方式是将自己的名字放入其主机文件中。虽然由于各种原因这是一个好主意,但底层问题确实应该得到解决。

  1. DNS搜索列表通常应设置为包含主机名的域名 - 或者主机名应完全自我限定。
  2. DNS应该为主机正确设置。

这使得它完全不是一个C问题,而是一个服务器配置问题。那就是了。

+0

对mods的注意 - 此答案在serverfault的传输目标中有效。可能不会被表决得很高,但总比没有答案好。 – Joshua