1. 程式人生 > >如何將域名轉換為ip

如何將域名轉換為ip

一,前言
這篇文章主要講述瞭如何將域名如“www.baidu.com”轉換為類似“127.0.0.1”的IP地址,轉換的過程主要使用了DNS協議相關的內容,但我們的重點並不是這裡,有興趣的可自行了解。我主要講的是如何使用,主要包括以下幾個內容:
1,hostent結構體
2,gethostbyname函式的用法
以上內容全都是在Linux環境裡。

二,詳細內容
1,hostent結構體
struct hostent
{
char * h_name;
char ** alias_list;
int h_addrtype;
int h_length;
char ** h_addr_list;
};
h_name:主機的規範名,如“www.baidu.com”,它的規範名其實是“www.a.shifen.com”,這一點可以通過ping命令得到。

這裡寫圖片描述

alisa_list:這是主機的別名,它是一個二級指標,這是因為主機的別名有可能有好幾個。

h_addrtype:指主機的IP地址型別,到底是IPV4還是IPV6。

h_length:指主機的IP地址長度。

h_addr_list:它也是一個二級指標,它主要指向主機IP地址陣列的指標,這是因為一個主機它的IP地址可能有多個,這也不難理解,如果你有多個網絡卡,你的IP地址自然也是有多個,但它們實際卻都是指向你的。
另外還有一個定義h_addr它是一個指標,它指向h_addr_list[0],其實大部分時候我們只需要一個IP地址就夠了,所以沒必要知道那麼多它的別名,需要注意的是這裡的IP都是二進位制的形式,它不是我們常見的點分十進位制形式,所以如果直接列印可能會帶來疑惑。
2,gethostbyname函式


它所在標頭檔案:
sys/socket.h
netdb.h
//這裡之所以不用include那種形式是因為帶上‘#’markdown字型將會變大,所以見諒。
函式原型:
hosten* gethostbyname(const char* hostname);
它返回一個結構體的指標,如果沒有找到“hostname”,將會返回NULL。
接下來請看其使用:
2.1

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h> #include<string.h> int main(int argc,char* argv[]) { char* ptr,**pptr; struct hostent* hptr; char str[32]; ptr=argv[1]; if((hptr=gethostbyname(ptr))==NULL) { perror("gethostbyname"); return -1; } printf("offical hostname:%s\n",hptr->h_name); for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++) { printf("alias:%s\n",*pptr); } pptr=hptr->h_addr_list; for(;*pptr!=NULL;pptr++) { printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str))); } return 0; }

上述程式碼的功能主要是使用者給定一個域名,然後打印出它的別名,以及它的所有IP地址。

其中inet_ntop函式是將網路位元組序轉為點分十進位制形式。
請看執行結果:

這裡寫圖片描述
經過編譯之後,我們發現淘寶網的正式名稱其實是那一長串,而它的別名才是我們熟悉的那個。
2.2 h_addr的使用
我們已經知道,h_addr是一個域名眾多IP地址中的一個,但是因為它是二進位制形式,所以在使用時是可以直接使用的,如下:

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
 {
 //char* ptr,**pptr;
 struct hostent* hptr;
 //char str[32];
 ptr=argv[1];
 if((hptr=gethostbyname(ptr))==NULL)
     {
      perror("gethostbyname");
      return -1;
     }
/* printf("offical hostname:%s\n",hptr->h_name);
 for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)
 {
  printf("alias:%s\n",*pptr);
 }
pptr=hptr->h_addr_list;
 for(;*pptr!=NULL;pptr++)
 {
  printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));

 }*/
 struct in_addr myaddr;
 memcpy(&myaddr.s_addr,hptr->h_addr,sizeof(hptr->h_addr));
 printf("address:%s\n",inet_ntoa(myaddr));
 //printf("address:%s\n",inet_ntop(hptr->h_addrtype,ptr,str,sizeof(str)));
 return 0;
 }


結果:
這裡寫圖片描述

三,結論
遇到困難,搞了半天才弄明白了,記錄下來,方便自己,也留給需要的有緣人吧,綜上。