2010-05-06 72 views
1

我不能使用getaddrinfo(...)主機名解析,因此必須堅持gethostbyname(...)gethostbyname是否保證返回帶有IPv4地址的hostent結構?

是對gethostbyname(...)功能保證返回只包含成功的IPv4(AF_INET)地址hostent結構,所以,下面的代碼將總是導致一個IPv4地址:

int resolve(const char *name, struct in_addr *addr) { 

    struct hostent *he = gethostbyname(name); 

    if (!he) 
     return 1; 

    memcpy(addr,he->h_addr_list[0],4); 

    return 0; 
} 

回答

2

沒有,gethostbyname()可以返回IPV4(標準點)或IPv6(標準冒號,或者是點)符號,at least on Linux。你需要處理這個問題。我認爲它的各種實現只返回IPV4(例如PHP),但是我用過的每個C平臺都可以並將返回兩者。

如果您的應用程序僅爲IPV4,則不難了解您正在處理IPV6,如果用戶沒有合適的接口連接到遠程主機,則會發生錯誤。即使你的應用同時支持,用戶的網關支持什麼?

多於三個.或存在:其IPV6。

編輯

h_addrh_addrlist_[0]的同義詞,而h_length是所有地址的長度。

也許我沒有充分理解你的問題?

+0

因此,如果gethostbyname後面的DNS解析器返回IPv6地址,我的應用程序將失敗? – Robert 2010-05-06 19:00:13

+0

@羅伯特 - 這是主觀的。應用程序的_user_可以連接到IPV6地址嗎? – 2010-05-06 19:06:00

+0

@Tim:它也可以成功,因爲它是一個檢查網站更新的程序。但是,如果我也接受AF_INET6,我的結構應該多大? – Robert 2010-05-06 19:10:30

2

h_addrtype告訴您h_addr_list是否包含IPv4或IPv6或其他類型的地址。您可以使用開關來更改該行:memcpy(addr,he-> h_addr_list [0],4);到memcpy(addr,he-> h_addr_list [0],N);其中N是地址類型所需的長度。根據MSDN文檔,h_length是「每個」地址的長度。

相關問題