点分IP地址与数值IP地址相关的转换API使用介绍

ip地址转换相关的函数接口

在了解下面的函数接口之前,首先需要了解如下一些概念和术语:

  1. 网络字节序和本机字节序。即大小端格式。标准规定网络字节序大端模式
  2. ip地址的分类:
    1. IPv4地址:共32bit.由网络号+主机号组成。按照网络号和主机号所占位数的不同,分为A~E五类地址。具体内容自行百度吧。
    2. IPv6地址。
  3. ip地址的表示方法:
    1. 数值表示法:用uint32_t类型的大端模式整数表示。
    2. 点分字符串表示法:如"192.168.1.110".
  4. 域名。为了使ip地址方便记忆,便使用了域名进行映射。即www.baibu.com之类的名称。

下面的函数接口主要分为两类:

  1. ip地址的点分字符串表示法数值表示法之间的转换。涉及到了6个函数。包括一些过时的接口。
  2. 获取IPv4地址中的网络号和主机号。涉及到两个函数。

下面函数使用时需要包含arpa/inet.h

  1. int inet_aton(const char *cp,struct in_addr *inp)
    1. 转换点分字符串表示法(如"192.168.1.110")到数值表示法(网络字节序)。
    2. cp:要转换的点分字符串。
    3. inp:存放转换后的数值。
    4. return:成功返回不为零的值,失败返回0.
  2. in_addr_t inet_addr(const char *cp)
    1. 过时接口。功能类似inet_aton()函数。主要区别是如果输入的cp无效,就会返回INADDR_NONE表示地址错误,但其实INADDR_NONE(255.255.255.255)也是一个有效地址。即无法区分INADDR_NONE地址的转换。
  3. in_addr_t inet_network(const char *cp)
    1. 过时接口。功能类似inet_addr()函数。不过返回的数值地址是主机字节序。
  4. char *inet_ntoa(struct in_addr in)
    1. 与inet_aton()函数相反,将数值地址转换成点分字符串地址。返回转换后的地址。由于每个线程都会有一个字符串地址的实体buff.所以它是线程安全的。但在同一线程下,第二次调用会覆盖第一次转换的值。所以在必要时需要自己复制保存。
  5. const char *inet_ntop(int af, const void *src,char *dst, socklen_t size)
    1. 它是inet_ntoa()函数的升级版本,可以用来解析IPv6地址.
    2. af:要么是AF_INET(IPv4)要么是AF_INET6(IPv6).
    3. src:数值表示法的ip地址。
    4. dst:用于存放转换后的点分字符串表示法字符串的实体buff。
    5. size:dst实体buff的大小
    6. return:成功返回dst的指针。失败返回NULL.
  6. int inet_pton(int af,const char *src,void *dst)
    1. 它是inet_aton()函数的升级版本,可以用来解析IPv6地址.各个参数的含义和inet_ntop()中的差不多。
    2. return:成功返回1.0表示src输入错误。-1表示af指示错误。
      struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host)
    3. 由网络号和主机号制作一个IPv4地址。
      in_addr_t inet_lnaof(struct in_addr in)
    4. 获取地址的主机号。
      in_addr_t inet_netof(struct in_addr in)
    5. 获取地址的网络号.

下面是一个简单的函数使用例子。

#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netdb.h>

void main(void)
{
    char *strIp = "1.2.3.4";
    struct in_addr ipIs;
    int res = inet_aton(strIp,&ipIs);//将点分字符串地址转换为数值地址。
    if(res == 1){
        printf("%08X\n",ipIs.s_addr);//ipIs.s_addr为大端格式的ip数值地址
    }
    res = inet_network(strIp);//将点分字符串地址转换为数值地址。
    if(res > 0){
        printf("%08X\n",res);//res为小端格式的ip数值地址
    }

    struct in_addr tempIp =  inet_makeaddr(0x01,0x020304);
    printf("%08X\n",tempIp.s_addr);
    in_addr_t number = inet_netof(tempIp);
    printf("网络号为:%08X\n",number);
    number = inet_lnaof(tempIp);
    printf("主机号为:%08X\n",number);
}

关于技术交流

此处后的文字已经和题目内容无关,可以不看。
qq群:825695030
微信公众号:嵌入式的日常
如果上面的文章对你有用,欢迎打赏、点赞、评论。二维码


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

theboynoName

感谢鼓励

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

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

打赏作者

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

抵扣说明:

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

余额充值