在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數組作爲參數傳遞給該函數。
'gethostname()'是否返回有效的主機名?您不檢查錯誤的返回值。無論如何,調用'gethostbyname()'來調用'gethostname()'所報告的主機名是沒有意義的。這是檢索本地計算機IP地址的常見錯誤指導方式。您應該使用'GetAdaptersInfo' /'GetAdaptersAddresses'(Windows),'getifaddrs()'(* Nix)或其他類似平臺特定的函數直接枚舉本地接口。 –
是的,gethostname返回正確的主機名,但gethostbyname總是返回null。 –
你真的想完成什麼? 'gethostbyname()'執行DNS查找。根據您計算機的DNS設置,使用'gethostname()'報告的主機名不能保證返回有效的DNS結果。在某些平臺上,使用本地主機名調用'gethostbyname()'將返回結果,在某些平臺上不會。如果失敗,請檢查'WSAGetLastError()'/'h_errno'來找出原因。在任何情況下,反正'gethostbyname()'都不推薦使用,您應該使用'getaddrinfo()'代替。 –