有關gethostbyname 的不可重入

2021-10-25 14:20:46 字數 1046 閱讀 9771

最近發現很多小夥伴在自學linux網路程式設計這本書,中間可能會有許多不解的疑惑,書上有些地方講解的也不是很透徹,恰巧之前選修過這門課,今天分享乙個遇到的問題。

首先請看書的229頁,8.4.4 函式gethostbyname不可重入的例子

先看下這段**:

#include #include #include #include int main(int argc, char *ar**)

else

}/*列印網域名稱位址*/

for(i=0;;i++) else

}} }

return 0;

}

這是這段**的執行結果,其中第二行的執行結果是我的朋友問我最不能理解的:為什麼ht的h_name輸出結果是sohu而不是sina。

這就涉及到gethostbyname的函式處理方式,只需要了解一下幾點:

第一:gethostbyname處理資料時返回的結果是儲存在乙個靜態結構體變數中的,靜態變數大家都懂,作為本地的乙個全域性變數,只初始化一次,也就是說,下次對這個變數進行操作時,是基於這次的結果來操作的

第二:ht1和ht2這個結構體指標在執行gethostbyname這個函式後指向的是同乙個位址(即上面gethostbyname儲存返回結果的變數位址)(大家可以在編譯器裡分部執行檢視變數值的變化)

(表達可能不是很準確,大家可以理解我的意思即可或提出意見)

了解了這兩點後,我們就可以知道,(14和15行)在第一次gethostbyname執行完之後,儲存返回結果的變數的值儲存的是原始網域名稱host的網域名稱(即www.sina.com.cn),此時ht1也指向這個儲存這個變數的位址,但在第二次執行完之後,這個值已經變為了(www.sohu.com),而且此時ht1和ht2指向的位址都是這個結果的位址,所以第二行輸出結果時即使此時ht賦值為ht1,(25和26行)結果仍是www.sohu.com,大家可以分享一下自己的看法或提出意見。

gethostbyname 簡明用法

使用這個東西,首先要包含2個頭檔案 這個函式的傳入值是網域名稱或者主機名,例如 www.google.com wpc 等等。傳出值,是乙個hostent的結構 如下 如果函式呼叫失敗,將返回null。解釋一下這個結構,其中 char h name 表示的是主機的規範名。例如www.google.co...

gethostbyname 函式說明

gethostbyname 函式說明 用網域名稱或主機名獲取ip位址 包含標頭檔案 include include 函式原型 struct hostent gethostbyname const char name 這個函式的傳入值是網域名稱或者主機名,例如 www.google.cn 等等。傳出值...

linux下gethostbyname工作原理

既然這兩個函式能夠轉換 ip 和網域名稱,那麼,它們就會去訪問dns伺服器嗎?如果真的要去訪問,網路不通的情況下,它們又怎麼辦呢?帶著這些疑問,我在網上查了一下,並根據提示,做了一下試驗,簡單總結了一下 gethostbyname 網域名稱 ip gethostbyaddr ip 網域名稱 在解析的...