• 基本名字与地址转换


    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
     
     
     
     
  • 相关阅读:
    OS第6次实验报告:使用信号量解决进程互斥访问
    操作系统第5次实验报告:内存管理
    OS第4次实验报告:文件系统
    OS第3次实验报告:命名管道
    Derby小记
    eclipse连接SQL Server2012
    录屏工具——Captura
    OS第2次实验报告:创建进程
    OS第1次实验报告:熟悉使用Linux命令和剖析ps命令
    第四次实验报告:使用Packet Tracer理解RIP路由协议
  • 原文地址:https://www.cnblogs.com/xing901022/p/3529750.html
Copyright © 2020-2023  润新知