存入IP地址时,使用inet_pton函数将输入的十进制字符串转出二进制。取出IP时再使用inet_ptop函数将“二进制整数”转成“点分十进制整数”显示。这两个函数都在宏定义#include <arpa/inet.h>中

C文件,test_ip.c

 1 #include <stdio.h>
2 #include <arpa/inet.h>
3 #include "test_ip.h"
4
5 int main(int argc,char **argv)
6 {
7 ipmsg_t ip_msg;
8 ipaddr_t ip_addr;
9 char IPdotdec[20]="192.168.1.1";
10 inet_pton(AF_INET, IPdotdec, (void *)&ip_addr.ipv4); //字符串 ——> 网络字节流  
11 printf("decimal : %s -> hexadecimal : 0x%x\n",IPdotdec,ip_addr.ipv4);
12
13 ip_addr.ipv4 = ntohl(ip_addr.ipv4);
14 printf("decimal : %s -> hexadecimal : 0x%x\n",IPdotdec,ip_addr.ipv4);
15
16 ip_addr.ipv4 = htonl(ip_addr.ipv4);
17 ip_msg.ip_addr.data = (uint8_t *)&(ip_addr.ipv4);
18 ip_msg.ip_addr.len = 4;
19 ip_msg.prefix_len = 32;
20
21 char ip_str[20]={0};
22 inet_ntop(AF_INET, ip_msg.ip_addr.data, ip_str, INET_ADDRSTRLEN); //网络字节流 ——> 字符串
23 printf("%s\n",ip_str);
24 return 0;
25 }

test_ip.h文件用于放定义的结构体

 1 #ifndef __TEST_IP_H__
2 #define __TEST_IP_H__
3
4 #include <stdio.h>
5
6 #define uint8_t unsigned char
7 #define uint32_t unsigned int
8 typedef struct _ipdata_s {
9 uint8_t len;
10 uint8_t *data;
11 } ipdata_t;
12
13 typedef struct _ipmsg_s
14 {
15 ipdata_t ip_addr;
16 uint32_t prefix_len;
17 }ipmsg_t;
18
19 typedef struct _ip_addr_s {
20 uint32_t ipv4; //ipv4地址有32位,uint32_t就够了
21 uint32_t ipv6[4]; //ipv6地址有128位,用数组存uint32_t*4
22 } ipaddr_t;
23
24 #endif

运行结果

$ gcc -o test_ip test_ip.c
$ ./test_ip
decimal : 192.168.1.1 -> hexadecimal : 0x101a8c0
decimal : 192.168.1.1 -> hexadecimal : 0xc0a80101
192.168.1.1    

转换关系

十进制 192 168 1 1
二进制(32位) 11000000 10101000 00000001 00000001
十六进制 c0 a8 1 1

IPv6地址的存取,test_ipv6.c

 1 #include <stdio.h>
2 #include <arpa/inet.h>
3 #include "test_ip.h"
4
5 int main(int argc,char **argv)
6 {
7 ipmsg_t ip_msg;
8 ipaddr_t ip_addr;
9 char IPdotdec[46]="2017::192:168:11:1";
10 inet_pton(AF_INET6, IPdotdec, (void *)&ip_addr.ipv6); //字符串 ——> 网络字节流
11 printf("十六进制 : %s \n",IPdotdec);
12 printf("十进制 : %u %u %u %u\n", ip_addr.ipv6[0], ip_addr.ipv6[1],
13 ip_addr.ipv6[2], ip_addr.ipv6[3]);
14
15
16 ip_msg.ip_addr.data = (uint8_t *)&(ip_addr.ipv6[0]);
17 ip_msg.ip_addr.len = 16;
18 ip_msg.prefix_len = 128;
19 //ipv6的字符串:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
20 char ipv6_str[46]={0}; //最长是32(“x”)+7(“:”)=39个字节。定义46的数组就足够了
21     inet_ntop(AF_INET6, ip_msg.ip_addr.data, ipv6_str, INET6_ADDRSTRLEN);//网络字节流—>字符串
22 printf("%s\n",ipv6_str);
23 return 0;
24 }

运行结果

$ gcc -o test_ipv6 test_ipv6.c
$ ./test_ipv6
十六进制 : 2017::192:168:11:1
十进制 : 5920 0 1744933377 16781568
2017::192:168:11:1

转换关系

十六进制 1720 0 0 0 6801 9201 0100 1100
二进制(128位) 0001011100100000 0000000000000000 0000000000000000 0000000000000000 110100000000001 1001001000000001 0000000100000000 0001000100000000
十进制 5920  0  1744933377 16781568

参考:

IPV6 转换二进制:https://www.easycalculation.com/other/ipv6-to-binary.php

IPv4和IPv6地址的存取的更多相关文章

  1. (转)协议森林04 地址耗尽危机 (IPv4与IPv6地址)

    协议森林04 地址耗尽危机 (IPv4与IPv6地址) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! IP地址是IP协议的重要组 ...

  2. IP地址(IPv4)/IPv6地址的正则表达式

    原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...

  3. 校验IPv4和IPv6地址和URL地址

    1.校验IPV4地址: function validateIp(obj) { var ip=$(obj).val(); var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;// ...

  4. PHP中有关IPV4 和IPV6地址转换以及其它一些常见问题

    这里主要介绍一下 IPV4 / IPV6 在 PHP / MySQL 中如何转换.以及中间容易碰到的一些问题. 首先介绍两个函数: ip2long:将 IPV4 的字符串互联网协议转换成长整型数字 i ...

  5. IPv4 和 IPv6地址

    目前Internet上使用的基本都是IPv4地址,也就是说地址总共是32个比特位,也就是32位二进制数.  所以IPv4地址总的容量是 2的32次方 = 4294967296 比如 11010010 ...

  6. IPv6地址介绍

    IPv6地址介绍 2008 年 04 月 10 日 1. 认识IPv6地址 IPv4地址是类似 A.B.C.D 的格式,它是32位,用\".\"分成四段,用10进制表示:而IPv6 ...

  7. 6.ipv6地址配置

    1. "nmcli connection modify 网卡名 ipv4.addresses "ipv6地址" ipv6.method manual ". 2. ...

  8. IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类

    一.TCP socket ipv6与ipv4的区别 服务器端源代码如下: #include <stdio.h> #include <stdlib.h> #include < ...

  9. 【Atheros】pktgen的ipv6地址处理函数参考及ipv6基本知识

    pktgen有很多函数可以作为很好的网络相关的工具函数,这里列出ipv6中1:0:0:0:0:0:0:1和1::1这两种地址形式相互转化的工具函数. 第一个函数,用于把一个1:0:0:0:0:0:0: ...

  10. 【转帖】2011-2018年中国IPv6地址数量及国际出口带宽数走势情况[图]

    2011-2018年中国IPv6地址数量及国际出口带宽数走势情况[图] http://www.chyxx.com/industry/201910/791801.html 三亿多ipv4的地址. 接近9 ...

随机推荐

  1. 关于for循环当中发生强制类型转换的问题

    Map map1 = new HashMap(); Map map2 = new HashMap(); Map map3 = new HashMap(); List<Map> list = ...

  2. 华为路由器NAT基本配置命令

    NAT地址转换 静态 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]nat static global 202.169.10.5 inside 172.16.1.1 ...

  3. List接口中的常用方法

    void add(int index, Object ele):在index位置插入ele元素boolean addAll(int index, Collection eles):从index位置开始 ...

  4. Java云原生崛起微服务框架Quarkus入门实践

    @ 目录 概述 定义 GraalVM简介 为何使用 特性 官方性能 实战 入门示例 步骤 安装GraalVM 创建quarkus工程 Idea导入项目 Idea运行和调试 打包成普通的Jar 打包成依 ...

  5. Linux学习记录---(1、基本命令)

    文章目录 1 .基本命令 1.1.查看当前文件夹下的文件 1.2.进入某一个文件夹 1.3.一次进入多个文件夹 1.4.返回上一级 1.5.直接进入根目录 1.6.创建一个目录 2.Redis中的相关 ...

  6. python渗透测试入门——基础的网络编程工具

    <Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...

  7. 【MySQL】Navicat15 安装

    # Navicat安装` 提示`:鉴于之间已经出了MySQL的安装教程,在这了我也讲下,那个其实包含了两个知识点,既可以小白初次安装MySQL客户端,也面向想安装5.x和8.x两个版本的. --- @ ...

  8. 所有selenium相关的库

    通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...

  9. xss学习笔记(萌新版)

    xss简介 xss攻击者构造恶意信息然后在用户的浏览器上执行,主要分为反射性xss,这种主要是某个页面存在有漏洞的参数,然后填上恶意参数把整个链接发给用户或者管理员,他们点击了带有恶意参数的链接就会执 ...

  10. Karmada大规模测试报告发布:突破100倍集群规模

    摘要:在本文中,我们将介绍用于测试的相关指标,如何进行大规模测试,以及我们如何实现大规模的集群接入. 本文分享自华为云社区<突破100倍集群规模!Karmada大规模测试报告发布>,作者: ...