当前位置: 首页 > article >正文

用C语言列出Linux或Unix上的网络适配器

上代码:

1. #include <sys/socket.h>
2. #include <stdio.h>
3. 
4. #include <netdb.h>
5. #include <ifaddrs.h>
6. 
7. int main() {
8. 		struct ifaddrs *addresses;
9. 		if(getifaddrs(&addresses) == -1) {
10.			 printf("getifaddrs failed");
11.	         return -1;
12.     }
13. 	struct ifaddrs *address = addresses;
14. 	while(address){
15. 		int family = address->ifa_addr->sa_family;
16. 		if(family == AF_INET || family == AF_INET6){
17.				printf("%s\t",address->ifa_name);
18.				printf("%s\t",family == AF_INET ? "IPv4":"IPv6");
19.				char ap[100];
20.				const int family_size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
21.				getnameinfo(address->ifa_addr, family_size, ap,sizeof(ap),0,0,NI_NUMERICHOST);
22.				printf("\t%s\n",ap);
23.			}
24.         address = address->ifa_next;
25.	 	}
26.     freeifaddrs(addresses);
27.     return 0;
28. }

代码解释:

  • sys/socket.h 定义主要socket的操作和结构体,如sockaddr_in、AF_INET(IPv4地址族)、AF_INET6(IPv6地址族)等。

  • stdio.h 提供了通用文件操作的支持和窄字符输入输出的能力,如printf等。

  • netdb.h 这里包含许多对网络操作的定义 ,如addrinfo结构体,这里面有AI_NUMERICHOST,这是说返回数字主机地址作为名字等等。

  • ifaddrs.h 定义ifaddrs结构体和函数 getifaddrs, freeifaddrs。

  • 第8行:声明了 ifaddrs结构体指针,这个结构体:

struct ifaddrs {
	//因为ifaddrs是一个链表的数据结构,所以ifa_next是指向下一个节点的指针
	struct ifaddrs  *ifa_next; 
	char *ifa_name;    // 接口名称
	unsigned int ifa_flags;   // SIOCGIFFLAGS的标记,这是与设备io相关的控制标志
	struct sockaddr *ifa_addr;    //接口地址
	struct sockaddr *ifa_netmask; //接口网络掩码
	union { // 联合体
		struct sockaddr *ifu_broadaddr; // 接口广播地址
        struct sockaddr *ifu_dstaddr; //点到点目的地址
	} ifa_ifu;
	#define ifa_broadaddr ifa_ifu.ifu_broadaddr
	#define ifa_dstaddr ifa_ifu.ifu_dstaddr
	void *ifa_data;    //地址特定数据
           };

  • 第9行,getifaddrs函数取回网络适配器数据,这些数据是一个链表,所以将头指针赋给addresses指针变量
  • 第13行,struct ifaddrs *address = addresses; 将取回到指针地址赋给另外一个指针变量address,这样通过新指针address变量来遍历所有的数据,而不改变指针addresses的值。
  • 第15行,int family = address->ifa_addr->sa_family;取回接口地址的地址族。简单来说就是看它是IPv4还是IPv6 。
  • 第21行,getnameinfo函数取回名称
  • 第26行,freeifaddrs(addresses);用于释放指针
    运行的结果大概是这样的:
    请添加图片描述

http://www.kler.cn/a/233295.html

相关文章:

  • 浪潮信息“源”Embedding模型登顶MTEB榜单第一名
  • 985研一学习日记 - 2024.11.14
  • makefile 设置动态库路径参数
  • #include<string>和#include<string.h>有什么区别
  • sol机器人pump机器人如何实现盈利的?什么是Pump 扫链机器人?
  • 大模型时代,呼叫中心部门如何自建一套大模型在线客服?
  • 【C语言】深入理解指针
  • 从一到无穷大 #23 《流计算系统图解》书评
  • Netty应用(一) 之 NIO概念 基本编程
  • 人工智能|深度学习——基于全局注意力的改进YOLOv7-AC的水下场景目标检测系统
  • C++——位图与布隆过滤器
  • JVM系列——垃圾收集器Parrlel Scavenge、CMS、G1常用参数和使用场景
  • 二维差分---三维差分算法笔记
  • Android:自定义控件
  • Vue 封装的 axios 类的使用(小bug 改进)
  • 5G技术对物联网的影响
  • C# BackgroundWorker的使用
  • 广义表-C语言
  • 面向工业 X.0 的工业网络简述
  • 微软.NET6开发的C#特性——类、结构体和联合体
  • VitePress-12-markdown中使用vue的语法
  • 年货大数据(电商平台年货节数据):水果销售额增长72%,海鲜肉类涨幅高于蔬菜
  • Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)
  • React 常用 Hooks
  • 探索Gin框架:Golang Gin框架请求参数的获取
  • 【Web】基于Mybatis的SQL注入漏洞利用点学习笔记