簡述
返回對應於給定主機名的主機信息。
name:指向主機名的指針。
返回類型
Linux版
返回:非空指針——成功,空指針——出錯,同時設定h_errno
源碼
struct hostent* gethostbyname(const char *name)
{
err_t err;
ip_addr_t addr;
/* buffer variables for lwip_gethostbyname() */
HOSTENT_STORAGE struct hostent s_hostent;
HOSTENT_STORAGE char *s_aliases;
HOSTENT_STORAGE ip_addr_t s_hostent_addr;
HOSTENT_STORAGE ip_addr_t *s_phostent_addr[2];
/* query host IP address */
err = netconn_gethostbyname(name, &addr);
if (err != ERR_OK) {
LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err));
h_errno = HOST_NOT_FOUND;
return NULL;
}
注釋
gethostbyname()返回對應於給定主機名的包含主機名字和地址信息的hostent結構指針。結構的聲明與gethostbyaddr()中一致。
返回的指針指向一個由Windows Sockets實現分配的結構。應用程式不應該試圖修改這個結構或者釋放它的任何部分。此外,所有執行緒共用一份這個結構的拷貝(這裡應該是每個執行緒一份拷貝,原文是這樣的Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls.),所以應用程式應該在發出其他Windows Scokets API調用前,把自己所需的信息拷貝下來。
gethostbyname()實現沒有必要識別傳送給它的IP位址串。對於這樣的請求,應該把IP位址串當作一個未知主機名同樣處理。如果應用程式有IP位址串需要處理,它應該使用inet_addr()函式把地址串轉換為IP位址,然後調用gethostbyaddr()來得到hostent結構。
返回值
如果沒有錯誤發生,gethostbyname()返回如上所述的一個指向hostent結構的指針,否則,返回一個空指針。應用程式可以通過WSAGetLastError()來得到一個特定的錯誤代碼。
錯誤代碼
WSANOTINITIALISED 在套用這個API前,必須成功地調用WSAStartup()。
WSAENTDOWN Windows Sockets實現檢測到了網路子系統的錯誤。
WSAHOST_NOT_FOUND 沒有找到授權應答主機。
WSATRY_AGAIN 沒有找到非授權主機,或者SERVERFAIL。
WSANO_RECOVERY 無法恢復的錯誤,FORMERR,REFUSED,NOTIMP。
WSANO_DATA 有效的名字,但沒有關於請求類型的數據記錄。
WSAEINPROGRESS 一個阻塞的Windows Sockets操作正在進行。
WSAEINTR 阻塞調用被WSACancelBlockingCall()取消了.
需要注意的是gethostbyname()函式屬於WinSock API庫,而在使用WinSock API之前,必須調用WSA-Startup函式,只有該函式成功返回(表示應用程式與WinSock庫成功地建立起連線),應用程式才可以調用其他Windows Sockets DLL中的函式。當程式將要結束時,又必須調用WSACleanup 函式進行清理工作,以便釋放其占用的資源。WSACleanup 函式用來結束Windows Sockets DLL的使用。
參見: WSAAsyncGetHostByName(), gethostbyaddr()