您的位置:首页 > 其它

基本名字与地址转换

2016-05-21 12:08 274 查看
DNS中的资源记录RR resource record



AAAA

PTR

MX

CNAME

 

名字和数值地址间的转换:gethostbyname() gethostbyaddr()

服务名字和端口号之间的转换: 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,getprotobynum
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: