1. 程式人生 > >gethostbyname 和 gethostbyname_r(可重入的)得到dns資訊

gethostbyname 和 gethostbyname_r(可重入的)得到dns資訊

使用這個東西,首先要包含2個頭檔案:
#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name);
這個函式的傳入值是域名或者主機名,例如"www.google.com","wpc"等等。
傳出值,是一個hostent的結構(如下)。如果函式呼叫失敗,將返回NULL。
struct hostent {
     char *h_name;
     char **h_aliases;
     int h_addrtype;
     int h_length;
     char **h_addr_list;
};

解釋一下這個結構, 其中:
char *h_name 表示的是主機的規範名。例如www.google.com的規範名其實是www.l.google.com
char **h_aliases 表示的是主機的別名。www.google.com就是google他自己的別名。有的時候,有的主機可能有好幾個別名,這些,其實都是為了易於使用者記憶而為自己的網站多取的名字。
int h_addrtype 表示的是主機ip地址的型別,到底是ipv4(AF_INET),還是ipv6(AF_INET6)
int h_length 表示的是主機ip地址的長度
int **h_addr_lisst 表示的是主機的ip地址,注意,這個是以網路位元組序儲存的。千萬不要直接用printf帶%s引數來打這個東西,會有問題的哇。所以到真正需要打印出這個IP的話,需要呼叫inet_ntop()。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
這個函式,是將型別為af的網路地址結構src,轉換成主機序的字串形式,存放在長度為cnt的字串中。
這個函式,其實就是返回指向dst的一個指標。如果函式呼叫錯誤,返回值是NULL。
下面是例程,有詳細的註釋。
#include <netdb.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
char *ptr,**pptr;
struct hostent *hptr;
char str[32];
/* 取得命令後第一個引數,即要解析的域名或主機名 */
ptr = argv[1];
/* 呼叫gethostbyname()。呼叫結果都存在hptr中 */
if( (hptr = gethostbyname(ptr) ) == NULL )
{
printf("gethostbyname error for host:%s/n", ptr);
return 0; /* 如果呼叫gethostbyname發生錯誤,返回1 */
}
/* 將主機的規範名打出來 */
printf("official hostname:%s/n",hptr->h_name);
/* 主機可能有多個別名,將所有別名分別打出來 */
for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
printf(" alias:%s/n",*pptr);
/* 根據地址型別,將地址打出來 */
switch(hptr->h_addrtype)
{
case AF_INET:
case AF_INET6:
pptr=hptr->h_addr_list;
/* 將剛才得到的所有地址都打出來。其中呼叫了inet_ntop()函式 */
for(;*pptr!=NULL;pptr++)
printf(" address:%s/n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
break;
default:
printf("unknown address type/n");
break;
}
return 0;
}

*******************************************************************************************************************************

使用gethostbyname_r得到dns資訊

在使用前需要看看所使用系統是否有這個函式

在網路開發中 經常出現需要從主機名得到ip地址的情況 這時就使用gethostbyname
但是因為gethostbyname返回的是一個指向靜態變數的指標 不可重入
很可能剛要讀時值就被其它執行緒修改

所以 新的posix中增加了另一個可重入的從主機名(域名)得到DNS的孫數
gethostbyname_r

下面是它用法的簡單例子


CODE
#include <netdb.h>
 #include <stdio.h>
 #include <netinet/in.h>
 
 #define DUMP(...)   printf(__VA_ARGS__)
 int main(int argc,char** argv)
- {
|     char    buf[1024];
|     struct  hostent hostinfo,*phost;
|     int     ret;
|
|     DUMP("argc:%d\n",argc);
-     if(argc <2 ){
2         printf("ERROR:test domainname\n");
2         return 1;
2     }
|
|     if(gethostbyname_r(argv[1],&hostinfo,buf,sizeof(buf),&phost,&ret))
|         printf("ERROR:gethostbyname(%s) ret:%d,phost:%d\n",argv[1],ret,(int)ph
| ost);
-     else{
2         int i;
       printf("gethostbyname(%s) success:ret:%d,",argv[1],ret);
2         if(phost)
2             printf("phost(%d):name:%s,addrtype:%d(AF_INET:%d),len:%d,addr[0]:%
2 d,[1]:%d\n",        
2                     (int)phost,phost->h_name,phost->h_addrtype,AF_INET,
2                     phost->h_length,
2                     (int)phost->h_addr_list[0],
2                     phost->h_addr_list[0] == NULL?0
2                     :(int)phost->h_addr_list[1]);
2         for(i = 0;hostinfo.h_aliases[i];i++)
2             printf("host(%d) alias is:%s\n",(int)&hostinfo,hostinfo.h_aliases[
2 i]);
2         for(i = 0;hostinfo.h_addr_list[i];i++)
2             printf("host addr is:%s\n",inet_ntoa(*(struct in_addr*)hostinfo.h_
2 addr_list[i]));
2     }
|
|     return 0;
| }

相關推薦

gethostbyname gethostbyname_r得到dns資訊

使用這個東西,首先要包含2個頭檔案: #include <netdb.h> #include <sys/socket.h> struct hostent *gethostbyname(const char *name); 這個函式的傳入值是域名或者主

Java併發基礎-鎖的使用及原理鎖、讀寫鎖、內建鎖、訊號量等

本文目錄: 1 基礎 1.1 可重入鎖 可重入鎖表示的是,如果一個執行緒在未釋放已獲得鎖的情況下再次對該物件加鎖,將可以加鎖成功。而且可以不斷的加鎖成功多次。但需要注意的是,每次加鎖操作必須對應著一次釋放鎖的操作。 如以下示例是可以執行的(

java 自旋鎖且無死鎖

java自旋鎖 的實現原理:如果自旋鎖被另外一個執行緒物件持有,那麼當前獲取鎖的執行緒將陷入while迴圈等待,直到那個持有自旋鎖的執行緒物件釋放它所持有的自旋鎖,那麼那些想要獲取該自旋鎖的執行緒物件 將會有一個獲得該自旋鎖。   基於他這種原理,等待的時候,並不釋放cpu

IOC控制反轉DI依賴註

str font span clas 男男女女 pri 銷毀 自己 過程 IOC(控制反轉): 那麽IoC是如何做的呢?有點像通過婚介找女朋友,在我和女朋友之間引入了一個第三者:婚姻介紹所。婚介管理了很多男男女女的資料,我可以向婚介提出一個列表,告訴它我想找個什麽樣的女朋友

支援選擇檔案目錄多選的檔案對話方塊CSelectDialog

MFC自帶的CFileDialog不支援選擇目錄,而且多選檔案配置也不方便。有一些實現比較好的目錄選擇對話方塊,但是既可以支援選擇檔案,又可以支援選擇目錄的非常難得。非常感謝Hojjat Bohlooli([email protected])的工作,給我們提供了一

java編程一個可以 進行多個選擇題測驗成績從高到低依次輸出學生下標成績可以

answer 學生 pre sys har b數 swe 另一個 統計 成績可重復,從高到低輸出,不會重復輸出 public class GradeExam { public static void main(String[] args) {

ReenTrantLocksynchronized的區別總結

循環 比較 關於 兩種方法 sdn 一個 隨機 targe condition ReenTrantLock可重入鎖(和synchronized的區別)總結 可重入性: 從名字上理解,ReenTrantLock的字面意思就是再進入的鎖,其實synchronized關鍵字所使用

Linux訊號程式設計實踐 訊號傳送函式函式

    在早期的UNIX中訊號是不可靠的,不可靠在這裡指的是:訊號可能丟失,一個訊號發生了,但程序卻可能一直不知道這一點。 現在Linux 在SIGRTMIN實時訊號之前的都叫不可靠訊號,這裡的不可靠主要是不支援訊號佇列,就是當多個訊號發生在程序中的時候(收到訊號的

Java併發程式設計1內建鎖

每個Java物件都可以用做一個實現同步的鎖,這些鎖被稱為內建鎖或監視器鎖。執行緒在進入同步程式碼塊之前會自動獲取鎖,並且在退出同步程式碼塊時會自動釋放鎖。獲得內建鎖的唯一途徑就是進入由這個鎖保護的同步程式碼塊或方法。 當某個執行緒請求一個由其他執行緒持有的鎖時,發出請求的執行緒就會阻塞。然而,由於內建鎖是可

Java並發編程1內置鎖

自己 如果 監視器 退出 進一步 自動 其他 實例 () 每個Java對象都可以用做一個實現同步的鎖,這些鎖被稱為內置鎖或監視器鎖。線程在進入同步代碼塊之前會自動獲取鎖,並且在退出同步代碼塊時會自動釋放鎖。獲得內置鎖的唯一途徑就是進入由這個鎖保護的同步代碼塊或方法。 當某個

分散式鎖__基於Zookeeper實現分散式鎖

1  重入的實現 對於鎖的重入,我們來想這樣一個場景。當一個遞迴方法被sychronized關鍵字修飾時,在呼叫方法時顯然沒有發生問題,執行執行緒獲取了鎖之後仍能連續多次地獲得該鎖,也就是說sychronized關鍵字支援鎖的重入。對於ReentrantLock,雖然沒有像sych

ReentrantLock不看後悔,看了必懂

ReentraantLock是通過一個FIFO的等待佇列來管理獲取該鎖所有執行緒的。在“公平鎖”的機制下,執行緒依次排隊獲取鎖(先等待的執行緒先獲得鎖);而“非公平鎖”在鎖是可獲取狀態時,不管自己是不是在佇列的開頭都會獲取鎖。  ReentrantLock和synchroni

Java原始碼解析之鎖ReentrantLock

上文接Java原始碼解析之可重入鎖ReentrantLock(一)。 接下來是tryLock方法。程式碼如下。從註釋中我們可以理解到,只有當呼叫tryLock時鎖沒有被別的執行緒佔用,tryLock才會獲取鎖。如果鎖沒有被另一個執行緒佔用,那麼就獲取鎖,並立刻返回true,並把鎖計數設定為1.

Java原始碼解析之鎖ReentrantLock

本文基於jdk1.8進行分析。 ReentrantLock是一個可重入鎖,在ConcurrentHashMap中使用了ReentrantLock。 首先看一下原始碼中對ReentrantLock的介紹。如下圖。ReentrantLock是一個可重入的排他鎖,它和synchronized的方法

Java鎖的種類以及辨析

作者:山雞 鎖作為併發共享資料,保證一致性的工具,在JAVA平臺有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及型別卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

Java多執行緒程式設計-2-鎖以及Synchronized的其他基本特性

原文出自 : https://blog.csdn.net/xlgen157387/article/details/78005352 一、Synchronized鎖重入 (1)關鍵字Synchronized擁有鎖重入的功能,也就是在使用Synchronized的時候,當一

Java挑戰併發1內建鎖

每個Java物件都可以用做一個實現同步的鎖,這些鎖被稱為內建鎖或監視器鎖。執行緒在進入同步程式碼塊之前會自動獲取鎖,並且在退出同步程式碼塊時會自動釋放鎖。獲得內建鎖的唯一途徑就是進入由這個鎖保護的同步程式碼塊或方法。 當某個執行緒請求一個由其他執行緒持有的鎖時

函式reentrant function

由於用到了strtok函式,順便搜了一下reentrant,看這篇講的不錯,貼來~~ 原帖地址:http://blog.chinaunix.net/u/27708/showart_322733.html 可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀《 APUE

java併發程式設計十二--內建鎖

    每個Java物件都可以用做一個實現同步的鎖,這些鎖被稱為內建鎖或監視器鎖。執行緒在進入同步程式碼塊之前會自動獲取鎖,並且在退出同步程式碼塊時會自動釋放鎖。獲得內建鎖的唯一途徑就是進入由這個鎖保護的同步程式碼塊或方法。     當某個執行緒請求一個由其他執行緒持有

鎖的獲取釋放須要註意的一點兒事

style 能夠 public 獲取 post 不能 lock stat exec 什麽是可重入鎖,不可重入鎖呢?"重入"字面意思已經非常明顯了,就是能夠又一次進入。可重入鎖,就是說一個線程在 獲取某個鎖後,還能夠繼續獲取該鎖,即同意一個線程多次獲取同一個鎖。比方syn