c语言如何输出ipv6header

作者&投稿:冉虏 (若有异议请与网页底部的电邮联系)
~ 从文件/proc/net/if_inet6中获取ipv6地址

我们先来看看文件/proc/net/if_inet6中有什么内容:
图2:文件/proc/net/if_inet6内容
这个文件中,每行为一个网络接口的数据,每行数据分成 6 个字段
序号
字段名称
字段说明
1
ipv6address
ipv6地址,16位(4个字符)一组,16进制,中间没有分隔符
2
ifindex
接口设备号,每个设备不同
3
prefixlen
前缀长度,类似子网掩码
4
scopeid
scope id
5
flags
接口标志,标识这个接口的特性
6
devname
接口设备名称
所以从这个文件中可以很容易地获得所有接口的 ipv6 地址:
#include <stdio.h>
#include <linux/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void) {
FILE *f;
int scope, prefix;
unsigned char _ipv6[16];
char dname[IFNAMSIZ];
char address[INET6_ADDRSTRLEN];

f = fopen("/proc/net/if_inet6", "r");
if (f == NULL) {
return -1;
}
while (19 == fscanf(f,
" %2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx %*x %x %x %*x %s",
&_ipv6[0], &_ipv6[1], &_ipv6[2], &_ipv6[3], &_ipv6[4], &_ipv6[5], &_ipv6[6], &_ipv6[7],
&_ipv6[8], &_ipv6[9], &_ipv6[10], &_ipv6[11], &_ipv6[12], &_ipv6[13], &_ipv6[14], &_ipv6[15],
&prefix, &scope, dname)) {
if (inet_ntop(AF_INET6, _ipv6, address, sizeof(address)) == NULL) {
continue;
}
printf("%s: %s\n", dname, address);
}
fclose(f);

return 0;
}
fscanf中的%2hhx是一种不多见的用法,hhx表示后面的指针&_ipv6[x]指向一个unsigned char *,2表示从文件中读取的长度,这个是常用的;
关于fscanf中的hh和h的用法,可以查看在线手册man fscanf了解更多的内容;
ipv6地址一共128位,16位一组,一共8组,但是这里为什么不一次从文件中读入4个字符(16 位),读8次,而要一次读入2个字符读16次呢?
这个要去看inet_ntop的参数,我们先使用命令man inet_ntop看一下inet_ntop的在线手册:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
当第1个参数af=AF_INET6时,对于第2个参数,还有说明:

AF_INET6
src points to a struct in6_addr (in network byte order) which is converted to a representation of
this address in the most appropriate IPv6 network address format for this address. The buffer dst
must be at least INET6_ADDRSTRLEN bytes long.
很显然,需要第2个参数指向一个struct in6_addr,这个结构在netinet/in.h中定义:

/* IPv6 address */
struct in6_addr
{
union
{
uint8_t __u6_addr8[16];
uint16_t __u6_addr16[8];
uint32_t __u6_addr32[4];
} __in6_u;
#define s6_addr __in6_u.__u6_addr8
#ifdef __USE_MISC
# define s6_addr16 __in6_u.__u6_addr16
# define s6_addr32 __in6_u.__u6_addr32
#endif
};
这个结构在一般情况下使用的是uint8_t __u6_addr8[16],也就是16个unsigned char的数组,只有在"混杂模式"时才使用8个unsigned short int或者4个unsigned int的数组;

所以,实际上struct in6_addr的结构如下:

struct in6_addr {
unsigned char __u6_addr8[16];
}
这就是我们在读文件时为什么要一次读入2个字符,读16次,要保证读出的内容符合struct in6_addr的定义;

一次从文件中读入4个字符(16位),读8次,和一次读入2个字符读16次有什么不同呢?我们以16进制的f8e9为例;
当我们每次读入 2 个字符,读 2 次时,在内存中的排列是这样的:

unsigned char _ipv6[16];
fscanf(f, "%2hhx2hhx", &_ipv6[0], &_ipv6[1]);
unsigned char *p = _ipv6
f8 e9
-+ -+
| |
| +------- p + 1
+----------- p
当我们每次读入 4 个字符,读 1 次时,在内存中的排列是这样的:

unsigned int _ipv6[8]
fscanf(f, "%4x", &_ipv6[0])
unsigned char *p = (unsigned char *)_ipv6
e9 f8
-+ -+
| |
| +------- p + 1
+----------- p
这是因为X86系列CPU的存储模式是小端模式,也就是高位字节要存放在高地址上,f8e9这个数,f8是高位字节,e9是低位字节,所以当我们把f8e9作为一个整数读出的时候,e9 将存储在低地址,f8存储在高地址,这和struct in6_addr的定义是不相符的;

所以如果我们一次读4个字符,读8次,我们就不能使用inet_ntop()去把ipv6地址转换成我们所需要的字符串,当然我们可以自己转换,但有些麻烦,参考下面代码:

unsigned short int _ipv6[8];
int zero_flag = 0;
while (11 == fscanf(f,
" %4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx %*x %x %x %*x %s",
&_ipv6[0], &_ipv6[1], &_ipv6[2], &_ipv6[3], &_ipv6[4], &_ipv6[5], &_ipv6[6], &_ipv6[7],
&prefix, &scope, dname)) {
printf("%s: ", dname);
for (int i = 0; i < 8; ++i) {
if (_ipv6[i] != 0) {
if (i) putc(':', stdout);
printf("%x", _ipv6[i]);
zero_flag = 0;
} else {
if (!zero_flag) putc(':', stdout);
zero_flag = 1;
}
}
putc('\n', stdout);
}
和上面的代码比较,多了不少麻烦,自己去体会吧。

写个for循环


电信ipv是怎么设置的?
1. 连接设备:将IPTV机顶盒通过HDMI线或AV线连接到电视上,并确保电源线和网线都已正确连接。2. 开机设置:打开电视和IPTV机顶盒,进入机顶盒的初始设置界面。3. 选择语言和网络:在设置界面中选择合适的语言,并设置网络连接,可以选择有线网络或无线网络。4. 输入账号信息:根据电信提供的IPTV账号和密码...

SAP软件如何做会计分录
1、进入SAP软件主页,可以在事务代码框那里输入FS00进行回车。2、等来到一个新的界面以后,需要点击总账科目的相关按钮。3、这个时候,需要在G\/L详细注释那里输入管理进行回车。4、下一步会自动进行操作,这样一来即可达到做会计分录的目的了。

网络基本知识都是哪些呀?
链接:https:\/\/pan.baidu.com\/s\/10TzA2Q5OUW6oBxwtJX-1eQ 提取码:du9b 2018视频|考前介绍.mp4|考前串讲2.mp4|考前串讲1.mp4|第9章 安全性知识-3.mp4|第9章 安全性知识-2.mp4|第9章 安全性知识-1.mp4|第8章 数据库技术-5.mp4|第8章 数据库技术-4.mp4|第8章 数据库技术-3.mp4|第...

资源管理系统源码 v1.0 ,如何配置本地服务器?
5)灵活的输出缓存: 根据应用程序的需要,ASP.NET 可以缓存页数据、页的一部分或整个页。缓存的项目可以依赖于缓存中的文件或其他项目,或者可以根据过期策略进行刷新。6)国际化: ASP.NET 在内部使用 Unicode 以表示请求和响应数据。可以为每台计算机、每个目录和每页配置国际化设置。7)移动设备支持:...

音质好的MP3 注意音质第一 高分请高手推荐
没用,这是事实,还有,我要说一句,现在已经没有什么IPOD VIDEO了,IPV全部改名为IPC,了解了吗? 我知道你们很难相信这个事实,很不好意思,IPC是目前市面上直推机器中最好的机器之一。2。IPOD NANO4(1400):还是IPOD,就是要让你们受打击,不过NANO4有点勉强,因为NANO4必须接个二房才能发挥真...

计算机网络原理的目录
网络传输协议或简称为传送协议(Communications Protocol),是指计算机通信的共同语言。现在最普及的计算机通信为网络通信,所以“传送协议”一般都指计算机通信的传送协议,如:TCP\/IP、NetBEUI等。然而,传送协议也存在于计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同程序之间的消息,都需要有一个...

网络管理员考试考点分析与真题详解的目录
2.4.1输入\/输出设备一览2.4.2输入\/输出控制器2.4.3外设的识别2.4.4外设的访问2.4.5常见输入\/输出接口2.4.6总线2.5本章例题分析第3章操作系统基础知识3.1计算机软件系统概述3.2操作系统的基本概念3.3作业管理3.4进程管理3.5存储管理3.6设备管理3.7文件管理3.8本章例题分析第4章数据库系统基础知识4.1数据库技术的发展4.2...

网络工程师考试内容有哪些?
1.1.3输入输出结构和设备·中断、DMA、通道、SCSI·I\/O接口·输入输出设备类型和特征1.2操作系统知识1.2.1基本概念·操作系统的功能及分类·多道程序·内核和中断控制·进程和线程1.2.2处理机管理、存储管理、设备管理、文件管理·进程的状态及转换·进程调度算法·死锁·存储管理方案·文件管理·作业调度算法1.3系统...

密码学与网络安全的目录
所属分类: 图书 >> 计算机\/网络 >> 信息安全 本书以清晰的脉络、简洁的语言,介绍了各种加密技术、网络安全协议与实现技术等内容,包括各种对称密钥算法与AES,非对称密钥算法、数字签名与RSA,数字证书与公钥基础设施,Internet安全协议,用户认证与Kerberos,Java、.NET和操作系统的加密实现,网络安全、防火墙与VPN,并给出...

英语基础差,针对考研如何弥补?
包括公共课,数学,英语以及各大专业课的学习资源,后面会不断汇聚更多优秀学习资源,供大家交流分享学习,需要的可以先收藏转存,有时间慢慢看~考研资料包实时更新 通过百度网盘分享的文件:2024考研英语...链接:https:\/\/pan.baidu.com\/s\/1gRHOl9bkT8IpVcVvuxdiJQ ?pwd=1234 提取码:1234 ...

高陵县18076268145: linux c怎么获得IPv6地址? -
仲姬盐酸: 编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="dhcp"#BOOTPROTO="static" HWADDR="2C:27:D7:31:2C:4C"#IPADDR="192.168.0.2" IPV6INIT="yes" IPV6_AUTOCONF="yes" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" 保证IPV6选项为YES ,所处环境中有IPV6网路的话就可以自动获取了.自己也可以用linux搭建一个.然后用ifconfig eth0 查看网卡信息参数

高陵县18076268145: C语言编程对IPV6地址进行压缩算法用函数实现 -
仲姬盐酸: #include int main(void) { char s1[50],s2[50]={0}; int n; scanf("%d",&n); while(n--) { int f; char *p=s1, *q=s2; int t; scanf("%s",s1); while(p { sscanf(p, "%x",&t); if(t==0 && f==0) { f=1; } else { sprintf(q, "%X", t); while(*q)q++; } *q++=':'; p+=5; } *(q-1)=0; puts(s2); } return 0; }

高陵县18076268145: 用C语言写个程序:先获取本机MAC地址,据此得到Link Local地址(IPv6 Address) -
仲姬盐酸: 麻烦,不爱动手,上网查一下,就那么两个api,一用就ok了.easy的很.#include #include #include void byte2Hex(unsigned char bData,unsigned char hex[]) { int high=bData/16,low =bData %16; hex[0] = (high <10)?('0'+high):('A'+high-10); hex[1]...

高陵县18076268145: 用C语言编写程序:建立一个顺序排列环状链表,有一个header指针指向最小节点 -
仲姬盐酸: #include "stdio.h" typedef struct student { int num; struct student *next; } LNode, *LinkList; LinkList create(void) { LinkList head; LNode *p1, *p2; char a; head = NULL; a = getchar(); while (a != '\n') { p1 = (LNode*)malloc(sizeof(LNode)); /*分配空间...

高陵县18076268145: 如何在vc6下纯c编写和使用dll -
仲姬盐酸: VC编写dll文件1、VC++->New->Project->Win32 Dynamic_Link Library;2、选择创建一个空工程;首先DLL需要一个头文件,所以新建一个C\C++ Header File这个头文件中必须包含想要输出的变量和函数,头文件必须定义用于输出的任何符...

高陵县18076268145: C语言编程 -
仲姬盐酸: #include <stdio.h>#include <malloc.h> struct node { int val; struct node *next; }; struct node* create_list(int *val_arr, unsigned int len); struct node* delete_node(struct node *header, int _val); void print_list(struct node *header); int main() { int val_list[] ...

高陵县18076268145: 怎样用C语言判断一个IPV6的地址是一个网段 -
仲姬盐酸: 1、只根据ip判断网段可根据第一组数字的数值范围;2、根据目前ipv4标准,默认的a类地址第一组数值范围为1-126,b类地址第一组数值范围为128-191,a类地址第一组数值范围为192-223;3、然后a类地址默认掩码为255.0.0.0,b类255.255.0.0,c类255.255.255.0;4、举例192.168.1.1,判断为c类地址,其网段为192.168.1.0.

高陵县18076268145: Linux下如何配置IPv6地址 -
仲姬盐酸: linux操作系统配置IPv6地址方法:1 配置IPv6地址 vi /tc/sysconfig/network-scripts/ifcfg-eth0 修改以下三个地方 IPV6INIT=”yes” IPV6ADDR=2400:A480:AAAA:200::159 IPV6_DEFAULTGW=2400:A480:AAAA:200::12 重启网络服务PING外网测试连通性 service netowork restart ping ipv6.baidu.com

高陵县18076268145: 怎么编写C语言程序,如:Helloworld的? -
仲姬盐酸: 代码如下:#include <stdio.h> int main(void) { printf("Hello, world!"); return 0; } 一、首先,打开我们的Visual C++ 6.0软件,我使用的为中文版,软件主界面如下图所示:1、然后点击上图工具栏中的文件,里面有个新建菜单,然后我们可以设...

高陵县18076268145: C语言解释~帮忙
仲姬盐酸: printf(HEADER1); &&& 输出-------------------------------ZGGZ----------------------------------------相当于printf(“-------------------------------ZGGZ---------------------------------------- ”); ZGGZ* p; &&& 定义结构体类型为ZGGZ 的指针 pp=&pp; &&& 将类型为...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网