2015-11-17 115 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