基本名字與地址轉換

DNS中的資源記錄RR resource record
AAAA
PTR
MX
CNAME
 

名字和數值地址間的轉換:gethostbyname() gethostbyaddr()node

服務名字和端口號之間的轉換: getservbyname() getservbyport()
 
解析器代碼讀 依賴於 配置文件,文件/etc/resolv.conf通常包含本地名字服務器IP地址。
 
DNS替代方法:靜態主機文件,/etc/hosts或者網絡信息系統NIS。
struct hostent{ char * h_name; char * * h_aliases; int h_addrtype; int h_length; char * * h_addr_list; }; #define h_addr h_addr_list[0];
執行一個對A記錄或者AAAA記錄的查詢
struct hostent * gethostbyname(const char * hostname);
h_errno的常值:
HOST_NOT_FOUND
TRY_AGAIN
NO_RECOVERY
NO_DATA
 
使用方法:
int main(int argc,char ** argv){ char *ptr,**pptr; char str[INET6_ADDRSTRLEN]; struct hostent *hptr; while(--argc > 0){ ptr =  *++argv; if((hptr=gethostbyname(ptr)) == NULL){ err_msg("gethostbyname error for host:%s:%s", ptr,hstrerror(h_errno)); continue; } }//給每一個命令行參數調用gethostbyname()
    printf("official hostname:%s\n",hptr->h_name); //規範主機名輸出
    for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++) printf("\tallias:%s\n",*pptr); switch(hptr->h_addrtype){ case AF_INET: #ifdef AF_INET6 case AF_INET6: #endif pptr = hptr->h_addr_list; for( ;*pptr != NULL;pptr++) //pptr只想一個指針數組,數組中每一個指針都指向一個地址。
                printf("\taddress:%s\n", inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str))); break; default: err_ret("unknown address type"); break; } exit(0); }

 

gethostbyaddr()函數
取一個二進制的IP地址並找到對應於這個地址的主機名。
struct hostent * gethostbyaddr(const char *addr,size_t len,int family);

 

addr是一個真正指向含有IPV4或者IPV6地址結構的指針
 
uname()返回當前主機名字
int uname(struct utsname * name);
經過調用uname獲得主機名字,而後調用gethostbyname獲得全部IP地址
 
char ** my_addrs(int * addrtype){ struct hostent *hptr; struct utsname myname; if(uname(&myname) < 0) return(NULL); if((hptr = gethostbyname(myname.nodename)) == NULL) return(NULL); *addrtype = hptr->haddrtype; return(hptr->h_addr_list); }

 

gethostname函數
返回當前主機名字
int gethostname(char *name,size_t namelen);
name指向主機名存儲位置的指針
namelen數組的大小
 
主機與端口號的映射包含在一個文件中 /etc/services
 
struct servent * getservbyname(const char * servname,const char * protoname); struct servent{ char * s_name; char * * s_aliases; int s_port; char * s_proto; };

 

調用方法:
struct servent * sptr; sptr = getservbyname("ftp","tcp"); sptr = getservbyname("ftp","udp"); //由於ftp僅支持TCP,所以會失敗

 

getservbyport()給定端口號和可選協議,查找相應的服務
struct servent * getservbyport(int port,const char * protname);//port必須爲網絡字節序
 
所以調用方法:
struct servent * sptr; sptr = getservbyport(htons(53),"udp");

 

信息    數據文件              結構        鍵值搜索函數
主機    /etc/hosts          hostent     gethostbyaddr,gethostbyname
網絡    /etc/networks   netent       getnetbyaddr,getnetbyname
協議    /etc/protocols   protoent         getprotobyname,getprotobynumber
服務    /etc/services     servent      getservbyname,getservbyport
相關文章
相關標籤/搜索