gethostbyname()

gethostbyname()

gethostbyname()返回對應於給定主機名的包含主機名字和地址信息的hostent結構的指針。結構的聲明與gethostbyaddr()中一致。

簡述

返回對應於給定主機名的主機信息。

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()

相關詞條

相關搜尋

熱門詞條

聯絡我們