zoukankan      html  css  js  c++  java
  • 基本名字与地址转换

    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
    ",hptr->h_name); //规范主机名输出
        for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)
            printf("	allias:%s
    ",*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("	address:%s
    ",
                                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
     
     
     
     
  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/xing901022/p/3529750.html
Copyright © 2011-2022 走看看