接下来介绍两组地址转换函数,它们在ASCII字符串和网络字节序的二进制值之间转换网际地址。
(1).inet_aton,inet_addr和inet_ntoa在点分十进制数串与它长度为32的网络字节序二进制值间转换IPV4地址。你可能会在许多现有代码中见到这些函数。
(2)两个较新的函数inet_pton和inet_ntop对于IPV4地址和IPV6地址都是适用的。
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
//返回:若字符串有效则为1,否则为0
in_addr_t inet_addr(const char *strptr);
//返回:若字符串有效则为32位二进制网络字节序的IPV4地址,否则为INADDR_None
char *inet_ntoa(struct in_addr inaddr);
//返回:指向一个点分十进制数串的指针
第一个函数将strptr所指C字符串转换成一个32位的网络字节序二进制值,并通过指针addrptr来存储。若成功则返回1,否则返回0。
inet_aton函数有一个没有写入正式文档中的特征:如果addrptr指针为空,那么该函数仍然对输入的字符串执行有效性检查,但是不存储任何结果。
inet_addr进行相同的转换,返回值为32位的网络字节序二进制值。该函数存在一个问题:所有2的32次方个可能的二进制值都是有效的Ip地址(0.0.0.0到255.255.255.255),但是当出错时该函数返回INADDR_NONE常值(通常是一个32位均为1的值)。这意为着点分十进制数串255.255.255.255不能由该函数处理,因为他的二进制值被用来指示该函数失败。
inet_addr函数还存在一个潜在问题:一些手册页面声明该函数出错时返回-1而不是INDDR_NONE。这样在对该函数的返回值(一个无符号的值)和一个负常数(-1)进行比较是可能会发生错误,具体取决于C编译器。
如今Inet_addr已经被废弃,新的代码改为inet_aton函数。更加好的办法是使用两个新函数,他们对ipv4和ipv6都适用。
inet_ntoa函数将一个32位的网络字节序二进制IPV4地址转换成相应的点分十进制数串。由该函数的返回值所指向的字符串驻留在静态内存中。这意为着该函数是不可重入的,,最后需要注意,该函数以一个结构而不是以指向该结构的指针作为其参数
本文介绍了用于IPv4地址转换的函数inet_aton、inet_addr及inet_ntoa,以及更通用的适用于IPv4和IPv6地址的inet_pton和inet_ntop函数。文章详细解释了这些函数的功能、参数和返回值,并讨论了inet_addr函数存在的问题及其替代方案。

被折叠的 条评论
为什么被折叠?



