使用struct ifreq实现ifconfig
转自:http://blog.csdn.net/joker0910/article/details/7855998
ifconfig是我们查看/设定网口状态常用的命令,其实这个命令就是对一些系统函数的封装,通过对struct ifreq的修改,我们可以很轻易地设定网口状态,获取网口状态。
这个结构体位于<net/if.h>头文件中,打开去看看吧,对照着英文注释,很容易找到自己想要的东西。而网卡相关的一些ioctl操作, 也就是用于查询/修改状态的标记位,都在<linux/sockios.h>中,很清晰的,找份源码看看吧。下面是一个小示例,演示了获取信息的过程,如果有需要,也可以启用那个修改状态的函数,注意,修改状态标记位的时候,需要用到超级用户的权限。
- /**
- * \file getifstat.c
- * \author wzj
- * \brief 访问这个struct ifconf 修改,查询状态
- * \version
- * \note
- * \date: 2012年08月11日星期六22:55:25
- */
- #include <net/if.h> /* for ifconf */
- #include <linux/sockios.h> /* for net status mask */
- #include <netinet/in.h> /* for sockaddr_in */
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <stdio.h>
- #define MAX_INTERFACE (16)
- void port_status(unsigned int flags);
- /* set == 0: do clean , set == 1: do set! */
- int set_if_flags(char *pif_name, int sock, int staus, int set)
- {
- struct ifreq ifr;
- int ret = 0;
- strncpy(ifr.ifr_name, pif_name, strlen(pif_name) + 1);
- ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
- if(ret)
- return -1;
- /* set or clean */
- if(set)
- ifr.ifr_flags |= status;
- else
- ifr.ifr_flags &= ~status;
- /* set flags */
- ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
- if(ret)
- return -1;
- return 0;
- }
- int get_if_info(int fd)
- {
- struct ifreq buf[MAX_INTERFACE];
- struct ifconf ifc;
- int ret = 0;
- int if_num = 0;
- ifc.ifc_len = sizeof(buf);
- ifc.ifc_buf = (caddr_t) buf;
- ret = ioctl(fd, SIOCGIFCONF, (char*)&ifc);
- if(ret)
- {
- printf("get if config info failed");
- return -1;
- }
- /* 网口总数 ifc.ifc_len 应该是一个出入参数 */
- if_num = ifc.ifc_len/sizeof(struct ifreq);
- printf("interface num is interface = %d\n", if_num);
- while(if_num-- > 0)
- {
- printf("net device: %s\n", buf[if_num].ifr_name);
- /* 获取第n个网口信息 */
- ret = ioctl(fd, SIOCGIFFLAGS, (char*)&buf[if_num]);
- if(ret)
- continue;
- /* 获取网口状态 */
- port_status(buf[if_num].ifr_flags);
- /* 获取当前网卡的ip地址 */
- ret = ioctl(fd, SIOCGIFADDR, (char*)&buf[if_num]);
- if(ret)
- continue;
- printf("IP address is: \n%s\n", inet_ntoa(((struct sockaddr_in *)(&buf[if_num].ifr_addr))->sin_addr));
- /* 获取当前网卡的mac */
- ret = ioctl(fd, SIOCGIFHWADDR, (char*)&buf[if_num]);
- if(ret)
- continue;
- printf("%02x:%02x:%02x:%02x:%02x:%02x\n\n",
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[0],
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[1],
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[2],
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[3],
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[4],
- (unsigned char)buf[if_num].ifr_hwaddr.sa_data[5]
- );
- }
- }
- void port_status(unsigned int flags)
- {
- if(flags & IFF_UP)
- {
- printf("is up\n");
- }
- if(flags & IFF_BROADCAST)
- {
- printf("is broadcast\n");
- }
- if(flags & IFF_LOOPBACK)
- {
- printf("is loop back\n");
- }
- if(flags & IFF_POINTOPOINT)
- {
- printf("is point to point\n");
- }
- if(flags & IFF_RUNNING)
- {
- printf("is running\n");
- }
- if(flags & IFF_PROMISC)
- {
- printf("is promisc\n");
- }
- }
- int main()
- {
- int fd;
- fd = socket(AF_INET, SOCK_DGRAM, 0);
- if(fd > 0)
- {
- get_if_info(fd);
- close(fd);
- }
- return 0;
- }
使用struct ifreq实现ifconfig相关推荐
- struct ifreq 学习,现实ifconfig 功能
一.struct ifreq结构体 这个结构定义在/usr/include/net/if.h,用来配置和获取ip地址,掩码,MTU等接口信息的. /* Interface request struct ...
- 《Linux网络接口》---------struct ifreq struct ifconf
网络接口--------------struct ifconf,struct ifreq 网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示: 接口 SIOCGIFC ...
- struct ifconf和struct ifreq,获取网线插入状态
struct ifreq 这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的 struct ifconf 通常是用来保存所有接口信息的 应用 想要获取当 ...
- 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq ...
- struct ifreq storage size of ‘ifr’ isn’t known记录
解决: 忘记包含头文件 #include <linux/if.h>
- Linux中ifreq 结构体分析和使用
结构原型: struct ifreq { #define IFHWADDRLEN 6 union { char ifrn_name[IFNAMSIZ]; } ifr_ifrn; u ...
- ifconfig源代码-NetBSD
NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备.NetBSD计 ...
- int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
这是一个来自linux内核4.20.1的代码段(af_inet.c): /** ioctl() calls you can issue on an INET socket. Most of these ...
- 多次 ifconfig down 无效的问题
多次 ifconfig down 无效的问题 ifconfig up.down 是怎样工作的 ifconfig 通过 ioctl 来完成工作.ifconfig 程序中与接口的 up.down 有关的代 ...
最新文章
- java 初始化系统参数_系统中参数的初始化 参数在系统中配置
- [BZOJ4766]文艺计算姬
- C++ 值传递、指针传递、引用传递
- Nginx的启动、停止和重启
- 分布式文件系统—HDFS—核心设计
- Underscore.js Version (1.2.3) 中文文档
- javascript window.open
- 解读年度数据库PostgreSQL:如何处理并发控制(一)
- display: flex的兼容性写法
- 使用eeupdate修改机器网卡mac地址
- kindle刷机ttl_[原创]只需USB线对Kindle 3修砖的小白教程
- 王者荣耀刷金币(python+adb实现)
- 2012服务器系统怎么安装sql,使用安装向导安装 SQL Server 2012(安装程序)
- html 搜索历史记录,使用cookie实现历史搜索记录功能
- 眼睛血管分割matlab版本
- 商业综合体能耗在线监测管理系统_商场管理平台
- 链路聚合|静态,动态配置|华为,思科配置|聚盒~
- python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解
- C#——获取银行卡所属银行,验证银行卡号是否正确
- 一款基于Webgl实现的3D类网页游戏
热门文章
- 震世出击: c/c++编程语言学习资料尽收眼底 电子书+视屏教程
- CF1734D Codeforces Round #822 (Div. 2) Slime Escape
- 男人一生必须做好的10件事
- 2022年演出经纪人演出经纪实务考试模拟试题卷及答案
- 国赛培训——随机化算法——蒙特卡洛模拟
- FaceApp一夜爆红引争议,这些AI黑科技都来了!
- 基于AI对胎儿头围的检测/测量
- Appium Desired Capabilities简单使用
- [ 常用工具篇 ] 使用 kali 实现网络钓鱼 -- setoolkit 详解实战(一)
- linux下启动tomcat访问html报错404