地址转换函数

3.1 老版本的转换函数

inet_aton、inet_aton、inet_ntoa在点分十进制(如206.168.112.96)与它长度为32位的网络字节序二进制值间转换IPv4地址

#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 inadrr);
                                       /*返回指向一个点分十进制数串的指针*/

3.2 inet_pton和inet_ntop函数

inet_pton 和 inet_ntop 这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。目前更多的是用这两函数进行地址转换。

在这两个函数中,函数名中p和n分别代表表达式和数值。地址的表达式格式通常是ASCII字符串,数值格式则是存放到套接字地址结构中的二进制。

#include <arpa/inet.h>
 
int inet_pton(int family, const char *strptr, void *addrptr);
 
				返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
 
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
 
				返回:若成功则为指向结果的指针,若出错则为NULL

这两个函数的family参数既可以是AF_INET也可以是AF_INET6.如果以不被支持的地址族作为family参数,这两个函数就都返回 一个错误,并将erron置为EAFNOSUPPORT。

第一个函数尝试转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。若成功则返回值为1,否则如果对所指定的family而言输入的字符串不是有效的表达格式,那么返回0.

inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达格式(strptr)。len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区。为有助于指定这个大小,在<netinet/in.h>头文件中有如下定义:

#define INET_ADDRSTRLEN 16 /* for IPv4 dotted-decimal */
#define INET6_ADDRSTRLEN 46 /* for IPv4 hex string */

如果len太小,不足以容纳表达格式结果(包括结尾的空字符),那么返回一个空指针,并置errno为ENOSPC。
inet_ntop函数的strptr参数不可以是一个空指针。调用者必须为目标存储单元分配内存并指定其大小。调用成功时,这个指针就是该函数的返回值。

下面总结下这5个地址转换函数(其中3个只是提到)。
image

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值