UNIX网络编程读书笔记:名字与地址转换


hostent *gethostbyname( *

本函数返回的非空指针指向如下的hostent结构:

      *h_name;          
         **h_aliases;       
            h_addrtype;      
            h_length;            
         **h_addr_list;     

hostent *gethostbyaddr( *addr, socklen_t len,

本函数返回一个同样指向hostent结构的指针。

addr参数实际上不是char *类型,而是一个指向存放IPv4地址的某个in_addr结构的指针;

len参数是这个结构的大小:对于IPv4地址为4;

family参数为AF_INET。

servent *getservbyname( *servname, *

本函数返回的非空指针指向如下的servent结构:

     *s_name;         
        **s_aliases;      
           s_port;         
         *s_proto;        

服务名参数servname必须指定。如果同时指定了协议(即protoname参数为非空指针),那么指定服务必须有匹配的协议。有些因特网服务既用TCP也用UDP提供(例如DNS),其他因特网服务则仅仅支持单个协议(例如FTP要求使用TCP)。如果protoname未指定而servname指定服务支持多个协议,那么返回哪个端口号取决于实现。

servent结构中我们关心的主要是端口号。既然端口号是以网络字节序返回的,把它存放到套接口地址结构时绝不能调用htons。

本函数的典型调用如下:

 servent *= getservbyname(, = getservbyname(, );

servent *getservbyport( port, *

port参数的值必须为网络字节序。本函数的典型调用如下:

 servent *= getservbyport(htons(), = getservbyport(htons(), );

getaddrinfo( *hostname, * addrinfo *hints, addrinfo **——成功;非0——出错

本函数通过result指针参数返回一个指向addrinfo结构链表的指针,而addrinfo结构定义在头文件<netdb.h>中:

                  ai_flags;         
                      ai_family;        
                      ai_socktype;      
                      ai_protocol;      
                    *ai_canonname;     
     sockaddr     *ai_addr;          
     addrinfo     *ai_next;          

其中,

hostname参数是一个主机名或地址串(IPv4的点分十进制数串或IPv6的十六进制数串)。

service参数是一个服务名或十进制端口号数串。

hints参数可以是一个空指针,也可以是一个指向某个addrinfo结构的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。

hints结构中调用者可以设置的成员有:

  • ai_flags(零个或多个在一起的AI_xxx值)
  • ai_family(某个AF_xxx值)
  • ai_socktype(某个SOCK_xxx值)
  • ai_protocol

其中ai_flags成员可用的标志值及其含义如下:

getnameinfo( sockaddr * * *serv, socklen_t servlen, ——成功,非0——出错

sockaddr指向一个套接口地址结构。

待返回的2个直观可读的字符串由调用者预先分配存储空间:host和hostlen指定主机字符串;serv和servlen指定服务字符串。如果调用者不想返回主机字符串,那就指定hostlen为0。同样,把servlen指定为0就是不想返回服务字符串。头文件<netdb.h>中定义了2个常值用于分配这两个存储空间:NI_MAXHOST给出主机字符串存储空间的最大长度,值为1025;NI_MAXSERV给出服务字符串存储空间的最大长度,值为32.

6个可指定的标志flags,用于改变getnameinfo的操作:

常值 说明
NI_DGRAM
NI_NAMEREQD
NI_NOFQDN
NI_NUMERICHOST
NI_NUMERICSCOPE
NI_NUMERICSERV
数据报服务
若不能从地址解析出名字则返回错误
只返回FQDN的主机名部分
以数串格式返回主机字符串
以数串格式返回范围标识字符串
以数串格式返回服务字符串

 

四类网络相关信息总结如下表:

信息 数据文件 结构 键值查找函数
主机
网络
协议
服务
/etc/hosts
/etc/networks
/etc/protocols
/etc/services
hostent
netent
protoent
servent
gethostbyaddr,gethostbyname
getnetbyaddr,getnetbyname
getprotobyname,getprotobynumber
getservbyname,getservbyport

相关内容