C语言动态获取设备的网络接口名称和状态以及对应的IP地址

一、目的

        在实际项目中需要获取设备的IP地址然后通过广播的形式通知局域网内的其他设备。

二、介绍

        方法一

        通过ioctl方式获取SIOCGIFADDR信息

/** C Program to Get IP Address*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <unistd.h>
#include <arpa/inet.h>int main(int argc, char **argv)
{int n;struct ifreq ifr;char *inf = argv[1];n = socket(AF_INET, SOCK_DGRAM, 0);//Type of address to retrieve - IPv4 IP addressifr.ifr_addr.sa_family = AF_INET;//Copy the interface name in the ifreq structurestrncpy(ifr.ifr_name, inf, IFNAMSIZ - 1);ioctl(n, SIOCGIFADDR, &ifr);close(n);//display resultprintf("IP Address is %s - %s\n" , inf , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );return 0;
}

        

gcc getip.c -o getip

         

         这种方法的前提是必须知道网络接口名称,比如enp1s0或者eth0

        参考资料

netdevice(7) - Linux manual pageicon-default.png?t=N658https://man7.org/linux/man-pages/man7/netdevice.7.html

 

        方法二         

        通过函数getaddrinfo实现

        在正式介绍之前,我们先介绍一下ifconfig -a的输出各个字段的含义

        

 

#include <sys/types.h>
#include <ifaddrs.h>/*
获取网络接口链表
*/
int getifaddrs(struct ifaddrs **ifap);/*
释放网络接口链表
*/
void freeifaddrs(struct ifaddrs *ifa);struct ifaddrs {struct ifaddrs  *ifa_next;    /* Next item in list */char            *ifa_name;    /* Name of interface */unsigned int     ifa_flags;   /* Flags from SIOCGIFFLAGS */struct sockaddr *ifa_addr;    /* Address of interface */struct sockaddr *ifa_netmask; /* Netmask of interface */union {struct sockaddr *ifu_broadaddr;/* Broadcast address of interface */struct sockaddr *ifu_dstaddr;/* Point-to-point destination address */} ifa_ifu;#define              ifa_broadaddr ifa_ifu.ifu_broadaddr#define              ifa_dstaddr   ifa_ifu.ifu_dstaddrvoid            *ifa_data;    /* Address-specific data */};

         各个字段含义:

        ifa_next:下一个接口的地址

        ifa_name:接口名称,例如"eth0"、"lo"

        ifa_flags:接口属性状态标志

                

        ifa_addr:接口的IP地址(ipv4/ipv6),当接口不在工作时该指针为NULL

        ifa_netmask:接口的子网掩码

        ifa_broadaddr:如果支持广播,此字段记录广播地址信息

        ifa_dstaddr:如果支持点对点通信,此字段记录对端地址

                

三、实战

        

#define _GNU_SOURCE     /* To get defns of NI_MAXSERV and NI_MAXHOST */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/if_link.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <string.h>int main(int argc, char *argv[])
{struct ifaddrs *ifaddr, *ifa;int family, s, n;char host[NI_MAXHOST];if (getifaddrs(&ifaddr) == -1) {perror("getifaddrs");exit(EXIT_FAILURE);}/* Walk through linked list, maintaining head pointer so wecan free list later */#if 1for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {if (ifa->ifa_addr == NULL)continue;printf("======1\n");family = ifa->ifa_addr->sa_family;/* Display interface name and family (including symbolicform of the latter for the common families) */printf("%-8s %s (%d)\n",ifa->ifa_name,(family == AF_PACKET) ? "AF_PACKET" :(family == AF_INET) ? "AF_INET" :(family == AF_INET6) ? "AF_INET6" : "???",family);/* For an AF_INET* interface address, display the address */printf("======2\n");if (family == AF_INET || family == AF_INET6) {s = getnameinfo(ifa->ifa_addr,(family == AF_INET) ? sizeof(struct sockaddr_in) :sizeof(struct sockaddr_in6),host, NI_MAXHOST,NULL, 0, NI_NUMERICHOST);if (s != 0) {printf("getnameinfo() failed: %s\n", gai_strerror(s));exit(EXIT_FAILURE);}printf("\t\taddress: <%s>\n", host);} else if (family == AF_PACKET && ifa->ifa_data != NULL) {struct rtnl_link_stats *stats = ifa->ifa_data;printf("\t\ttx_packets = %10u; rx_packets = %10u\n""\t\ttx_bytes   = %10u; rx_bytes   = %10u\n",stats->tx_packets, stats->rx_packets,stats->tx_bytes, stats->rx_bytes);}printf("======3\n");}
#elsefor (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {if (ifa->ifa_addr == NULL)continue;family = ifa->ifa_addr->sa_family;unsigned int flags = ifa->ifa_flags;if (family == AF_INET && (flags & (IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST))) {if (0 == strcmp(ifa->ifa_name, argv[1])) {s = getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST,NULL, 0, NI_NUMERICHOST);if (s != 0) {printf("getnameinfo() failed: %s\n", gai_strerror(s));exit(EXIT_FAILURE);}printf("\t\taddress: <%s>\n", host);}}}
#endiffreeifaddrs(ifaddr);exit(EXIT_SUCCESS);
}

        

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

Unity 编辑器-查找所有未被使用的Prefab

需求 接到一个需求&#xff0c;将Res里所有特效相关的prefab检查一下&#xff0c;没有使用的移除。 分析 先拆解一下需求&#xff0c;如下 #mermaid-svg-YiTzyE1BvQ0ZTgLj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

【运维】 第02讲(上):企业 Nginx 高性能优化配置实战总结

本课时讲解关于 Nginx 配置优化的内容&#xff0c;相信对于 Nginx 你一定并不陌生&#xff0c;它是一款轻量级的开源 Web 服务及代理程序。在 Nginx 出现之前市场上主流两款 Web 服务&#xff0c;一款是 Windows 系统上的 IIS&#xff0c;另外一款是 Linux 系统上的 Apache。而…

新耀东方|安全狗亮相2023第二届上海网络安全博览会

7月5日至7日&#xff0c;“新耀东方-2023第二届上海网络安全博览会暨高峰论坛”在上海顺利举办。此次大会由上海市信息网络安全管理协会、国家计算机网络应急技术处理协调中心上海分中心、(ISC)2上海分会、上海市普陀区科学技术委员会、上海市网络安全产业示范园共同主办。 作为…

【前后缀GCD】ABC125 C

C - GCD on Blackboard (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 这道题&#xff0c;多看看样例大概就出来了 由样例可知&#xff0c;换成的数可以是其他N-1个数的gcd&#xff0c;这样对答案的贡献也没有影响 所以直接去枚举换的是什么数就行 因此怎么去快速求其他…

webpack5性能优化

webpack构建速度 一、优化babel-loader 注意&#xff1a;开启缓存,配置后打包是就能缓存babel webpack.common.js文件命中缓存cacheDirectory {test: /\.js$/,use: [babel-loader?cacheDirectory],include: srcPath,exclude: /node_modules/ }, 测试&#xff1a; 打包后的…

开源堡垒机Guacamole二次开发记录之一

简介 项目中需要用到堡垒机功能&#xff0c;调研了一大圈&#xff0c;发现了Apache Guacamole这个开源项目。 Apache Guacamole 是一个无客户端的远程桌面网关&#xff0c;它支持众多标准管理协议&#xff0c;例如 VNC(RFB)&#xff0c;RDP&#xff0c;SSH 等等。该项目是Apa…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素&#xff0c;并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中&#xff0c;List 控件用于…

【力扣算法12】之 11. 盛最多水的容器 python

文章目录 问题描述示例1示例2提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果完结 问题描述 给定一个长度为 n 的整数数组 height 。有n条垂线&#xff0c;第i条线的两个端点是(i, 0)和(i, height[i])。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构…

Swagger、knife4j简介

Swagger 简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(API Documentation & Design Tools for Teams | Swagger)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的…

网络安全与防范

1.重要性 随着互联网的发达&#xff0c;各种WEB应用也变得越来越复杂&#xff0c;满足了用户的各种需求&#xff0c;但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…

【三维重建】【深度学习】NeuS总览

【三维重建】【深度学习】NeuS总览 论文提出了一种新颖的神经表面重建方法&#xff0c;称为NeuS&#xff0c;用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集&#xff0c;并开发一种新的体绘制方法来训练神经SDF表示&#xff…