博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基本名字与地址转换
阅读量:6837 次
发布时间:2019-06-26

本文共 2794 字,大约阅读时间需要 9 分钟。

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,getprotobynumber
服务    /etc/services     servent      getservbyname,getservbyport
 
 
 
 

转载地址:http://mgmkl.baihongyu.com/

你可能感兴趣的文章
Django1.4 python2.7 apache mod_python 安装与部署实例
查看>>
Fedora下的远程桌面连接
查看>>
浅析MySql二进制日志的应用
查看>>
您需要搭建怎样的网站来帮助您赚取更多利润?
查看>>
Ubuntu安装Cairo-Dock后,不能使用注销按钮和关机按钮
查看>>
SQL Server 2012 AlwaysOn Group 使用 Identity字段注意事项
查看>>
tcc新的插装引擎对比原有实现的改进
查看>>
20145328 《信息安全系统设计基础》第3周学习总结
查看>>
layoutSubviews何时调用的问题
查看>>
编译bash实现history的syslog日志记录
查看>>
Java数据类型
查看>>
mysql主从备份
查看>>
我的友情链接
查看>>
强化学习概览
查看>>
我的友情链接
查看>>
jdk1.8-stack 栈源码分析
查看>>
解决Windows Server 2008 System进程占用80端口
查看>>
python3--嵌套函数
查看>>
nagios监控网络设备
查看>>
[转] 配置VNC
查看>>