这里介绍两组地址转换函数,他们在ASCII字符串与网络字节序的二进制之间转换网际地址。
l inet_aton、inet_addr和inet_ntoa在点分十进制数串(如:“127.0.0.1”)与它的长度为32位的网络字节序二进制值间转换IPv4地址。
l 两个新的函数:inet_pton和inet_ntop对于IPv4和IPv6都适用。
l inet_addr()将一个char型字符串转换为32位的IPv4网络字节序,如果失败则返回INADDR_NONE;该函数存在一个问题,所有223个可能的二进制值都是有效的IP地址(从0.0.0.0~255.255.255.255)!!!!但是当出错时该函数返回INADDR_NONE,这就意味着点分十进制数串255.255.255.255(这是IPv4的有限广播地址)不能由该函数处理,因为它的二进制数值被用来指示该函数失败。
所以尽量使用
l inet_aton()和inet_addr()功能一样,但更加改进,在UNIX下建议使用;返回的结果转换为一个32位网络序二进制值,通过指针strptr所指;
l inet_ntoa()将一个32位网络字节序的二进制IPv4地址转换成相应的十进制字串。由该函数的返回值所指向的字符串驻留在静态内存中。这就意味着该函数是不可重入的。
这两个函数适用于IPv6地址,兼容IPv4,建议尽量使用它们。其中:
p:presentation--表达;
n:numeric—数值;
其中,Family可以是AF_INET也可以是AF_INET6;
inet_pton尝试转换由pszAddrString指针所指的字符串,通过pAddrBuf存放二进制结果;
若成功则返回1,否则返回0;
inet_ntop则相反,从数值转换为表达式,len参数是目标存储单元的大小,以避免函数溢出其调用者的缓冲区。为有助于指定这个大小,有如下定义:
如果len太小,不足以容纳表达式结果,那么返回一个空指针,并使errno为ENOSPC;该函数的pStringBuf不可以是一个空指针,调用者必须为目标存储单元分配内存并指定其大小。