网络字节序之间的转换函数详解

本文介绍了用于IPv4地址转换的函数inet_aton、inet_addr及inet_ntoa,以及更通用的适用于IPv4和IPv6地址的inet_pton和inet_ntop函数。文章详细解释了这些函数的功能、参数和返回值,并讨论了inet_addr函数存在的问题及其替代方案。

接下来介绍两组地址转换函数,它们在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地址转换成相应的点分十进制数串。由该函数的返回值所指向的字符串驻留在静态内存中。这意为着该函数是不可重入的,,最后需要注意,该函数以一个结构而不是以指向该结构的指针作为其参数

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值