怎么打开ip地址获取(怎么获取IP地址)
时间:2023-10-29 21:08:33 浏览量:34
使用通常获取ipv4的IP地址的方法是无法获取ipv6地址的,本文介绍了使用C语言获取ipv6地址的三种方法,每种方法均给出了完整的源程序,本文所有实例在ubuntu 20.04下测试通过,gcc版本9.4.0。
图1:ioctl无法获取ipv6地址
图2:文件/proc/net/if_inet6内容
序号
字段名称
字段说明
1
ipv6address
ipv6地址,16位(4个字符)一组,16进制,中间没有分隔符
2
ifindex
接口设备号,每个设备不同
3
prefixlen
前缀长度,类似子网掩码
4
scopeid
scope id
5
flags
接口标志,标识这个接口的特性
6
devname
接口设备名称
这个要去看inet_ntop的参数,我们先使用命令man inet_ntop看一下inet_ntop的在线手册:
当第1个参数af=AF_INET6时,对于第2个参数,还有说明:
很显然,需要第2个参数指向一个struct in6_addr,这个结构在netinet/in.h中定义:
这个结构在一般情况下使用的是uint8_t __u6_addr8[16],也就是16个unsigned char的数组,只有在"混杂模式"时才使用8个unsigned short int或者4个unsigned int的数组;
所以,实际上struct in6_addr的结构如下:
这就是我们在读文件时为什么要一次读入2个字符,读16次,要保证读出的内容符合struct in6_addr的定义;
当我们每次读入 2 个字符,读 2 次时,在内存中的排列是这样的:
当我们每次读入 4 个字符,读 1 次时,在内存中的排列是这样的:
这是因为X86系列CPU的存储模式是小端模式,也就是高位字节要存放在高地址上,f8e9这个数,f8是高位字节,e9是低位字节,所以当我们把f8e9作为一个整数读出的时候,e9 将存储在低地址,f8存储在高地址,这和struct in6_addr的定义是不相符的;
所以如果我们一次读4个字符,读8次,我们就不能使用inet_ntop()去把ipv6地址转换成我们所需要的字符串,当然我们可以自己转换,但有些麻烦,参考下面代码:
和上面的代码比较,多了不少麻烦,自己去体会吧。
图3:使用getnameinfo获取ipv6地址
欢迎访问我的博客:https://whowin.cn