关于地址转换函数

关于地址转换函数

在进行网络编程的时候,常常会遇到ASCII字符串与网络字节序的二进制之间的地址转换问题。

老版本的函数有:inet_aton(), inet_addr(), inet_ntoa()

  • inet_aton
    原型:int inet_aton(const char *strptr,struct in_addr *addrptr);
    功能:将strptr所指的字符串转换成一个32位的网络字节序的二进制值,并通过指针addrptr来存储(该函数对输入的字符串执行有效性检查)
    返回值:若字符串有效返回1,否则返回0
  • inet_addr
    原型:in_addr_t inet_addr(const char *strptr);
    功能:将strptr所指的字符串转换成一个32位的网络字节序的二进制值(该函数对输入的字符串不进行有效性检查,现已被废弃)
    返回值:若字符串有效则为32位二进制网络字节序的IPv4地址,否则为INADDR_NONE
  • inet_ntoa
    原型:char *inet_ntoa(struct in_addr inadrr);
    功能:将一个32位的网络字节序的二进制IPv4地址转换成相应的点分十进制数串。由该函数的返回值所指向的字符串驻留在静态内存中(原因参考函数返回局部变量地址的问题),这意味着该函数是不可重入的
    返回值:返回指向一个点分十进制数串的指针

新版本的函数有:inet_pton(), inet_ntop(),这两个函数对IPv4和IPv6都适应,其中,函数名中p和n分别表示:表达(presentation)和数值(numeric)

  • inet_pton
    原型:int inet_pton(int family, const char *strptr, void *addrptr);
    功能:将strptr所指的字符串转换成网络字节序的二进制值,并通过指针addrptr来存储。
    返回值:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
  • inet_ntop
    原型:const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
    功能:将strptr所指的字符串转换成网络字节序的二进制值。(len参数是目标存储单元的大小,以免该函数溢出其调用者的缓冲区)
    返回值:若成功则为指向结果的指针,若出错则为NULL

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

程序示例如下:

#include <stdio.h> 
#include <arpa/inet.h>

int main () 
{ 
    char IPdotdec[20]; //存放点分十进制IP地址 
    struct in_addr s; // IP地址结构体 
    
    // 输入IP地址 
    printf("Please input IP address: "); 
    scanf("%s", IPdotdec); 
    // 转换 
    inet_pton(AF_INET, IPdotdec, (void *)&s); 
    printf("inet_pton: 0x%x\n", s.s_addr);
    // 反转换 
    inet_ntop(AF_INET, (void *)&s, IPdotdec, 16); 
    printf("inet_ntop: %s\n", IPdotdec); 
    
    return 0;
}

测试结果如下所示:
在这里插入图片描述

参考博客:https://blog.csdn.net/weixin_40583386/article/details/85943569
https://blog.csdn.net/bian_qing_quan11/article/details/71699371
https://blog.csdn.net/qq_39187019/article/details/92566355
书籍:UNIX网络编程(卷1:套接字联网API)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值