利用函数进行ip地址转换

inet_addr、inet_ntoa、inet_pton、inet_ntop用法


1.分别利用函数 inet_addr、inet_pton ,将“字符串”192.168.12.13“转化位4字节整型数。
分别利用函数 inet_ntoa 、inet_ntop,将上面转换后的4字节整型数转换位字符串并输出。

inet_addr():

函数原型:unsigned long inet_addr (const char * cp);
功能:将点分十进制字符串表示的IP地址转换为32位的无符号长整型数,它是以网络字节顺序表示的32位二进制IP地址。
如果传入的字符串是一个非法的IP地址,函数返回值是常量INADDR_NONE。

inet_ntoa():

函数原型:char * inet_ntoa (struct in_addr in);
功能:将一个包含在in_addr结构变量in中的长整型IP地址转换点分十进制形式。
参数:是一个保存有32位二进制IP地址的in_addr结构变量。
函数调用成功返回一个字符指针,该指针指向一个char型缓冲区,该缓冲区保存有由参数in的值转换而来的点分十进制表示的IP地址字符串。如果函数调用失败,则返回一个空指针NULL。

void exchange()
{
    auto one = inet_addr("192.168.12.13");
    if (one!= INADDR_NONE)
    {
        cout << one << endl;
    }
    SOCKADDR_IN sockaddr;
    sockaddr.sin_addr.S_un.S_addr = inet_addr("192.168.12.13");
    auto pAddr = inet_ntoa(sockaddr.sin_addr);
    if (pAddr != NULL)
    {
        cout << pAddr << "\n";
    }
}

inet_pton():

int inet_pton(int af, const char *src, void *dst);
功能:inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换。

参数:
1.Af或AF_INET、AF_INET6

2.src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中。

3.af =src为指向IPV6的地址,函数将该地址转换为in6_addr的结构体,并复制在*dst中。
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。

inet_ntop():

const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
从数值格式(addrptr)转换到表达式(strptr)。

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

void exchange1()
{
    char szAddress[20] = {0};
    int b = 0; //初始化一个整形变量,用于存储转换后的四字节整型数
    int nRetValue = inet_pton(AF_INET, "192.168.12.13", &b);
    if (nRetValue)
    {
        cout << b << endl;
        auto pAddress = inet_ntop(AF_INET, &b, szAddress, sizeof(szAddress));
        if (pAddress != NULL)
        {
            cout << pAddress <<endl;
        }
    }
}

2.利用函数inet_pton、inet_ntop,将"2001:3211::1", 转换位IPV6地址,并转换字符串输出。
inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。
inet_pton和inet_ntop支持AF_INET和AF_INET6

void exchange3()
{
    char szAddress[20] = { "2001:3211::1" };
    struct sockaddr_in6 sinp6;
    int nRetValue = inet_pton(AF_INET6, szAddress, (void*)&sinp6);
    if (nRetValue)
    {
        auto pAddress = inet_ntop(AF_INET6,(void*)&sinp6, szAddress, sizeof(szAddress));
        if (pAddress != NULL)
        {
            cout << szAddress << endl;
        }
    }
}

运行实例

218933440
192.168.12.13
218933440
192.168.12.13
2001:3211::1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新西兰做的饭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值