转自:http://blog.csdn.net/joker0910/article/details/7855998

ifconfig是我们查看/设定网口状态常用的命令,其实这个命令就是对一些系统函数的封装,通过对struct ifreq的修改,我们可以很轻易地设定网口状态,获取网口状态。

这个结构体位于<net/if.h>头文件中,打开去看看吧,对照着英文注释,很容易找到自己想要的东西。而网卡相关的一些ioctl操作, 也就是用于查询/修改状态的标记位,都在<linux/sockios.h>中,很清晰的,找份源码看看吧。下面是一个小示例,演示了获取信息的过程,如果有需要,也可以启用那个修改状态的函数,注意,修改状态标记位的时候,需要用到超级用户的权限。

[cpp]  view plain  copy
  1. /**
  2. * \file getifstat.c
  3. * \author  wzj
  4. * \brief 访问这个struct ifconf 修改,查询状态
  5. * \version
  6. * \note
  7. * \date: 2012年08月11日星期六22:55:25
  8. */
  9. #include <net/if.h>       /* for ifconf */
  10. #include <linux/sockios.h>    /* for net status mask */
  11. #include <netinet/in.h>       /* for sockaddr_in */
  12. #include <sys/socket.h>
  13. #include <sys/types.h>
  14. #include <sys/ioctl.h>
  15. #include <stdio.h>
  16. #define MAX_INTERFACE   (16)
  17. void port_status(unsigned int flags);
  18. /* set == 0: do clean , set == 1: do set! */
  19. int set_if_flags(char *pif_name, int sock, int staus, int set)
  20. {
  21. struct ifreq ifr;
  22. int ret = 0;
  23. strncpy(ifr.ifr_name, pif_name, strlen(pif_name) + 1);
  24. ret = ioctl(sock, SIOCGIFFLAGS, &ifr);
  25. if(ret)
  26. return -1;
  27. /* set or clean */
  28. if(set)
  29. ifr.ifr_flags |= status;
  30. else
  31. ifr.ifr_flags &= ~status;
  32. /* set flags */
  33. ret = ioctl(sock, SIOCSIFFLAGS, &ifr);
  34. if(ret)
  35. return -1;
  36. return 0;
  37. }
  38. int get_if_info(int fd)
  39. {
  40. struct ifreq buf[MAX_INTERFACE];
  41. struct ifconf ifc;
  42. int ret = 0;
  43. int if_num = 0;
  44. ifc.ifc_len = sizeof(buf);
  45. ifc.ifc_buf = (caddr_t) buf;
  46. ret = ioctl(fd, SIOCGIFCONF, (char*)&ifc);
  47. if(ret)
  48. {
  49. printf("get if config info failed");
  50. return -1;
  51. }
  52. /* 网口总数 ifc.ifc_len 应该是一个出入参数 */
  53. if_num = ifc.ifc_len/sizeof(struct ifreq);
  54. printf("interface num is interface = %d\n", if_num);
  55. while(if_num-- > 0)
  56. {
  57. printf("net device: %s\n", buf[if_num].ifr_name);
  58. /* 获取第n个网口信息 */
  59. ret = ioctl(fd, SIOCGIFFLAGS, (char*)&buf[if_num]);
  60. if(ret)
  61. continue;
  62. /* 获取网口状态 */
  63. port_status(buf[if_num].ifr_flags);
  64. /* 获取当前网卡的ip地址 */
  65. ret = ioctl(fd, SIOCGIFADDR, (char*)&buf[if_num]);
  66. if(ret)
  67. continue;
  68. printf("IP address is: \n%s\n", inet_ntoa(((struct sockaddr_in *)(&buf[if_num].ifr_addr))->sin_addr));
  69. /* 获取当前网卡的mac */
  70. ret = ioctl(fd, SIOCGIFHWADDR, (char*)&buf[if_num]);
  71. if(ret)
  72. continue;
  73. printf("%02x:%02x:%02x:%02x:%02x:%02x\n\n",
  74. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[0],
  75. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[1],
  76. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[2],
  77. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[3],
  78. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[4],
  79. (unsigned char)buf[if_num].ifr_hwaddr.sa_data[5]
  80. );
  81. }
  82. }
  83. void port_status(unsigned int flags)
  84. {
  85. if(flags & IFF_UP)
  86. {
  87. printf("is up\n");
  88. }
  89. if(flags & IFF_BROADCAST)
  90. {
  91. printf("is broadcast\n");
  92. }
  93. if(flags & IFF_LOOPBACK)
  94. {
  95. printf("is loop back\n");
  96. }
  97. if(flags & IFF_POINTOPOINT)
  98. {
  99. printf("is point to point\n");
  100. }
  101. if(flags & IFF_RUNNING)
  102. {
  103. printf("is running\n");
  104. }
  105. if(flags & IFF_PROMISC)
  106. {
  107. printf("is promisc\n");
  108. }
  109. }
  110. int main()
  111. {
  112. int fd;
  113. fd = socket(AF_INET, SOCK_DGRAM, 0);
  114. if(fd > 0)
  115. {
  116. get_if_info(fd);
  117. close(fd);
  118. }
  119. return 0;
  120. }

使用struct ifreq实现ifconfig相关推荐

  1. struct ifreq 学习,现实ifconfig 功能

    一.struct ifreq结构体 这个结构定义在/usr/include/net/if.h,用来配置和获取ip地址,掩码,MTU等接口信息的. /* Interface request struct ...

  2. 《Linux网络接口》---------struct ifreq struct ifconf

    网络接口--------------struct ifconf,struct ifreq 网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示: 接口 SIOCGIFC ...

  3. struct ifconf和struct ifreq,获取网线插入状态

    struct ifreq 这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的 struct ifconf 通常是用来保存所有接口信息的 应用 想要获取当 ...

  4. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

    http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq ...

  5. struct ifreq storage size of ‘ifr’ isn’t known记录

    解决: 忘记包含头文件 #include <linux/if.h>

  6. Linux中ifreq 结构体分析和使用

    结构原型: struct ifreq { #define IFHWADDRLEN 6  union  {   char ifrn_name[IFNAMSIZ];    } ifr_ifrn;    u ...

  7. ifconfig源代码-NetBSD

    NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备.NetBSD计 ...

  8. 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 ...

  9. 多次 ifconfig down 无效的问题

    多次 ifconfig down 无效的问题 ifconfig up.down 是怎样工作的 ifconfig 通过 ioctl 来完成工作.ifconfig 程序中与接口的 up.down 有关的代 ...

最新文章

  1. java 初始化系统参数_系统中参数的初始化 参数在系统中配置
  2. [BZOJ4766]文艺计算姬
  3. C++ 值传递、指针传递、引用传递
  4. Nginx的启动、停止和重启
  5. 分布式文件系统—HDFS—核心设计
  6. Underscore.js Version (1.2.3) 中文文档
  7. javascript window.open
  8. 解读年度数据库PostgreSQL:如何处理并发控制(一)
  9. display: flex的兼容性写法
  10. 使用eeupdate修改机器网卡mac地址
  11. kindle刷机ttl_[原创]只需USB线对Kindle 3修砖的小白教程
  12. 王者荣耀刷金币(python+adb实现)
  13. 2012服务器系统怎么安装sql,使用安装向导安装 SQL Server 2012(安装程序)
  14. html 搜索历史记录,使用cookie实现历史搜索记录功能
  15. 眼睛血管分割matlab版本
  16. 商业综合体能耗在线监测管理系统_商场管理平台
  17. 链路聚合|静态,动态配置|华为,思科配置|聚盒~
  18. python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解
  19. C#——获取银行卡所属银行,验证银行卡号是否正确
  20. 一款基于Webgl实现的3D类网页游戏

热门文章

  1. 震世出击: c/c++编程语言学习资料尽收眼底 电子书+视屏教程
  2. CF1734D Codeforces Round #822 (Div. 2) Slime Escape
  3. 男人一生必须做好的10件事
  4. 2022年演出经纪人演出经纪实务考试模拟试题卷及答案
  5. 国赛培训——随机化算法——蒙特卡洛模拟
  6. FaceApp一夜爆红引争议,这些AI黑科技都来了!
  7. 基于AI对胎儿头围的检测/测量
  8. Appium Desired Capabilities简单使用
  9. [ 常用工具篇 ] 使用 kali 实现网络钓鱼 -- setoolkit 详解实战(一)
  10. linux下启动tomcat访问html报错404