inet_pton()和inet_ntop()函数使用实例

本文介绍了IP地址的两种类型IPv4和IPv6,以及它们的位数表示。重点讲解了inet_pton和inet_ntop两个函数的使用,这两个函数分别用于将IP地址字符串转换为网络地址结构体和将网络地址结构体转换回IP地址字符串。通过示例展示了如何处理IPv4和IPv6地址,并给出了输出结果。
摘要由CSDN通过智能技术生成

概述

IP格式最常见的是使用点分10进制表示,如: xx.xx.xx.xx (IPV4地址)。
IP地址分为两类:IPv4地址和IPv6地址。

  • IPv4 地址用32位来表示;
  • IPv6 地址用128位来表示;

由于二进制数太长,人们为了便于记忆和识别,就把每一段8位编为一组,每组之间用点号分开。然后将每个字节(八位组)转换为等值的十进制数,大小为0至255。

IP 地址分为A、B、C、D、E等 5 大类,由IP地址第一字节的几个最高位来定义和区分,简要如下表所示
IP地址分类

inet_pton

函数原型

 #include <arpa/inet.h>
 
 int inet_pton(int af, const char *src, void *dst);

This function converts the character string src into a network address structure in the af address family, then copies the network address structure to dst. The af argument must be either AF_INET or AF_INET6.

返回值

inet_pton() returns 1 on success (network address was successfully converted). 0 is returned if src does not contain a character string representing a valid network address in the specified address family. If af does not contain a valid address family, -1 is returned and errno is set to EAFNOSUPPORT.

inet_ntop

函数原型

#include <arpa/inet.h>

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

This function converts the network address structure src in the af address family into a character string. The resulting string is copied to the buffer pointed to by dst, which must be a non-NULL pointer. The caller specifies the number of bytes available in this buffer in the argument size.

返回值

On success, inet_ntop() returns a non-NULL pointer to dst. NULL is returned if there was an error, with errno set to indicate the error.

实例

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

void TestIpv6()
{
    char ipv6_addr[64];
    //内嵌 IPv4 地址的 IPv6 地址
    inet_pton(AF_INET6, "0:0:0:0:0:0:192.168.200.65", ipv6_addr);

    char ipv6_str[64]={'\0'};
    inet_ntop(AF_INET6, ipv6_addr, ipv6_str, 64);

    printf("%s\n", ipv6_str);
}

void TestIpv4()
{
    int ipv4_addr;
    inet_pton(AF_INET, "192.168.200.65", &ipv4_addr);
    printf("%d\n", ipv4_addr);

    char ipv4_str[64]={'\0'};
    inet_ntop(AF_INET, &ipv4_addr, ipv4_str, 64);

    printf("%s\n", ipv4_str);
}

int main()
{
    TestIpv6();
    TestIpv4();

    return 0;
}

上面代码输出结果为:

::192.168.200.65
1103669440
192.168.200.65

如果将地址设置为全 0,

inet_pton(AF_INET6, "0:0:0:0:0:0:0.0.0.0", ipv6_addr);

则打印结果为:

::

参考

inet_pton()和inet_ntop()函数详解
IPv6地址格式简介以及常见的IP地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值