首页 > 所有文章 > 行业 >文章详情

准确获取本地ip接口(如何查看电脑端口号和ip地址)

时间:2024-02-11 21:44:20 浏览量:312

使用通常获取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