inet_aton和inet_ntoa

1、 inet_aton()


int inet_aton(const char *cp, struct in_addr *inp);

 参数说明:

cp : IPv4点分十进制字符串,例如“192.168.1.2”、“10.28.1.1”等;

inp: 点分十进制转换成二进制后的结构体(网络字节序)

返回值:成功返回非0;失败返回0

注意:

这个函数已经将inp转换为网络字节序;已经将inp转换为网络字节序;已经将inp转换为网络字节序;

int inet_aton_demo()
{
    char *string="192.168.1.2";
    struct in_addr ip={0};
    unsigned char *c=NULL;

    if(!inet_aton(string, &ip)){
        printf("%s:%d error\n", __func__, __LINE__);
        return -1;
    }
    printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
    c=(char *)&ip.s_addr;
    printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3));

}

结果:

root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out 
0201a8c0 ---- 33663168			
c0 ---- a8 --- 01 --- 02		--->inet_aton()转换后的字节序

 从上述结果可以看出:

​ inet_aton()会将点分十进制的字符串转换为网络字节序的二进制数。此时如果要做网络用途使用的话,无需再次转换(即,无需再通过htonl做转换);但是如果想在本地上查看转换后的结果,则需要做一个转换(需要使用ntohl)。

2、 inet_ntoa()


char *inet_ntoa(struct in_addr in);

 参数说明:

inp: 点分十进制转换成二进制后的结构体(网络字节序)

返回值 : IPv4点分十进制字符串指针,例如“192.168.1.2”、“10.28.1.1”等;

注意:

​ 不可重入,不可重入,不可重入

​ 因为转换后的字符串使用同一块静态内存区,再次调用会被覆盖。

int inet_ntoa_demo()
{
    char *string=NULL;
    struct in_addr ip;
    unsigned char *c=NULL;

    ip.s_addr = 0xc0a80102;
    /*
    * 1. char *inet_ntoa(struct in_addr in);
    */

    if(!(string=inet_ntoa(ip))){
        printf("%s:%d %s\n", __func__, __LINE__, strerror);
        return -1;
    }
    printf("%s\n", string);
    printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
    c=(char *)&ip.s_addr;
    printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3));


    ip.s_addr = htonl(0xc0a80102);/*转换为网络字节序*/
    if(!(string=inet_ntoa(ip))){
        printf("%s:%d %s\n", __func__, __LINE__, strerror);
        return -1;
    }
    printf("%s\n", string);
    printf("%8.8x ---- %u\n", ip.s_addr, ip.s_addr);/**/
    c=(char *)&ip.s_addr;
    printf("%2.2x ---- %2.2x --- %2.2x --- %2.2x\n", *c, *(c+1), *(c+2), *(c+3));


    /*
        root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out 
        0201a8c0 ---- 33663168
        c0 ---- a8 --- 01 --- 02
        root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# 
    */
}

结果: 

root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# ./demo.out 
2.1.168.192					
c0a80102 ---- 3232235778			---主机字节序
02 ---- 01 --- a8 --- c0

192.168.1.2
0201a8c0 ---- 33663168				---网络字节序
c0 ---- a8 --- 01 --- 02
root@ubantu:/mnt/hgfs/em嵌入式学习记录/schedule调度器# 

从上述结果可以看出:

​ inet_ntoa()会将二进制数以网络字节序的方式解析为点分十进制字符串。因此我们再定义in_addr变量时,直接将其s_addr的值转换为网络字节序;但是如果想在本地上查看转换后的结果,则需要做一个转换(需要使用ntohl)。

小结: 使用in_addr.s_addr时,这个值里存储的应该一直为网络字节序。本地想查看该变量的值,应作一次ntohl转换;如果做网络收发等等,则无需做任何转换。
————————————————
版权声明:本文为CSDN博主「叨陪鲤」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/s2603898260/article/details/105964832

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值