地址转换函数(ip地址在计算中的识别方式,ipv4与ipv6,inet_ntop函数和inet_pton函数)

本文介绍了如何在编程中使用intinet_pton将点分十进制IP地址转换为整型数据,以及inet_ntop将整型IP地址转换回点分十进制字符串。同时,对比了IPv4和IPv6的地址结构和计数范围。
摘要由CSDN通过智能技术生成

计算机和网络中的ip地址

ip地址如192.168.3.103,在编程的时候,我们用的是点分十进制,属于字符串。
但在计算机和网络中该字符串ip是用整型保存并识别。

在这里插入图片描述

一个整型四个字节,一个字节存储一组的数。

int inet_pton (点分十进制字符串ip地址转整型数据)

p应该是Point,因为字符串版的ip是点分十进制
在这里插入图片描述

案例

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

int main()
{
    char ip_str[] = "192.168.3.103";
    unsigned int ip_int = 0;
    unsigned char* ip_p = NULL;

    // 将字符串数组格式的点分十进制Ip转化为32位无符号整型数据
    inet_pton(AF_INET,ip_str,&ip_int);

    printf("ip_int = %d\n",ip_int); //(ip_int是unsigned int类型)

    ip_p = (unsigned char *)&ip_int; // (将32位无符号整型数据 转为 无符号字符串格式)
    printf("in_uint = %d,%d,%d,%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3));
    return 0;
}

在这里插入图片描述

inet_ntop (整型数据转点分十进制字符串格式Ip地址)

函数中的Len用来指定转为字符串时是Ipv4还是v6
在这里插入图片描述

参考视频

地址转换函数

ipv4与ipv6

ipv4

有四组,每组一个字节,一共4x8=32位
ipv4一共有 2^32 =42 9496 7296 个地址。

ipv6

IPv6是由八组,每组四位16进制数字组成,每组之间由":"来分隔。

2610:00f8:0c34:67f9:0200:83ff:fe94:4c36,每个“:”前后都是416进制的数字,共分隔成8组。

在这里插入图片描述
ipv6有8组,每组16个字节。
共有 2^(16x8) = 2的128次方个

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
inet_ptoninet_ntop是用于IP地址转换的两个函数,分别用于将点分十进制的IPv4地址转换成网络字节序的二进制形式和将网络字节序的二进制形式的IPv4地址转换成点分十进制形式。 下面是它们的实现: ```c #include <arpa/inet.h> #include <string.h> int inet_pton(int af, const char *src, void *dst) { if (af == AF_INET) { struct in_addr addr; if (inet_aton(src, &addr) == 0) { return 0; } memcpy(dst, &addr.s_addr, sizeof(addr.s_addr)); return 1; } else if (af == AF_INET6) { struct in6_addr addr; if (inet_pton(AF_INET6, src, &addr) == 0) { return 0; } memcpy(dst, &addr, sizeof(addr)); return 1; } return -1; } const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) { if (af == AF_INET) { struct in_addr addr; memcpy(&addr.s_addr, src, sizeof(addr.s_addr)); if (inet_ntop(AF_INET, &addr, dst, size) == NULL) { return NULL; } return dst; } else if (af == AF_INET6) { struct in6_addr addr; memcpy(&addr, src, sizeof(addr)); if (inet_ntop(AF_INET6, &addr, dst, size) == NULL) { return NULL; } return dst; } return NULL; } ``` 对于inet_pton函数,我们首先判断地址族af是否为IPv4或IPv6,然后根据不同的地址族调用inet_aton或inet_pton进行转换。如果转换成功,则将转换后的二进制地址复制到dst指针所指向的内存,并返回1;否则返回0表示转换失败。 对于inet_ntop函数,我们同样首先判断地址族af是否为IPv4或IPv6,然后根据不同的地址族调用inet_ntop进行转换。如果转换成功,则将转换后的点分十进制地址复制到dst指针所指向的内存,并返回dst指针;否则返回NULL表示转换失败。需要注意的是,目标内存大小size应该足够存放转换后的地址

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

computer_vision_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值