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

用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_dstaddrvoid *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);用于释放指针
    运行的结果大概是这样的:
    请添加图片描述

相关文章:

  • 5.9 BCC工具之nodejs_http_server.py简介
  • [前端开发] 常见的 HTML CSS JavaScript 事件
  • aiofiles:解锁异步文件操作的神器
  • Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码
  • LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT
  • 树与二叉树---数据结构
  • bat脚本 创建计划任务 一分钟设置ntp同步周期为60s
  • Gin框架: 快速搭建起一个Web应用环境及处理不同类型的响应
  • wordpress外贸成品网站模板
  • 二叉树相关OJ题
  • Python编程中的异常处理
  • 利用Excel模拟投币试验
  • 简单试验:用Excel进行爬虫
  • 双活工作关于nacos注册中心的数据迁移
  • javaweb学习day03(JS+DOM)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • echarts的各种常用效果展示
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • IDEA 插件开发入门教程
  • jdbc就是这么简单
  • js写一个简单的选项卡
  • Linux各目录及每个目录的详细介绍
  • Material Design
  • python3 使用 asyncio 代替线程
  • Vue2 SSR 的优化之旅
  • webpack+react项目初体验——记录我的webpack环境配置
  • windows下mongoDB的环境配置
  • 安卓应用性能调试和优化经验分享
  • 基于游标的分页接口实现
  • 七牛云假注销小指南
  • 入门到放弃node系列之Hello Word篇
  • 消息队列系列二(IOT中消息队列的应用)
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 在Docker Swarm上部署Apache Storm:第1部分
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​插件化DPI在商用WIFI中的价值
  • ​香农与信息论三大定律
  • #git 撤消对文件的更改
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #前后端分离# 头条发布系统
  • ${ }的特别功能
  • (003)SlickEdit Unity的补全
  • (02)Hive SQL编译成MapReduce任务的过程
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计大学生兼职系统
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十八)三元表达式和列表解析
  • (转)【Hibernate总结系列】使用举例
  • (转)jdk与jre的区别
  • .FileZilla的使用和主动模式被动模式介绍