Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6457017
  • 博文数量: 579
  • 博客积分: 1548
  • 博客等级: 上尉
  • 技术积分: 16635
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-12 15:29
个人简介

http://www.csdn.net/ http://www.arm.com/zh/ https://www.kernel.org/ http://www.linuxpk.com/ http://www.51develop.net/ http://linux.chinaitlab.com/ http://www.embeddedlinux.org.cn http://bbs.pediy.com/

文章分类

全部博文(579)

文章存档

2018年(18)

2015年(91)

2014年(159)

2013年(231)

2012年(80)

分类: LINUX

2015-05-05 18:16:47

struct ifreq

这个结构定义在include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的

struct ifconf

通常是用来保存所有接口信息的

应用

想要获取当前网口网线插入状态,需要用到ifreq结构体,获取网卡的信息,然后socket结合网卡驱动的ioctl,就可以得到与网线插入状态相关的数据。



ioctl获得本地ip地址时要用到两个结构体ifconfifreq,它们对于大多数人
来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助
理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考.

首先先认识一下ifconfifreq

这两个结构体具体请看:linux下获取设置网卡信息ifconf,ifreq

上边这两个结构看起来比较复杂,我们现在把它们简单化一些:
比如说现在我们向实现获得本地IP的功能。

我们的做法是:
1. 先通过ioctl获得本地所有接口的信息,并保存在ifconf
2. 
再从ifconf中取出每一个ifreq中表示ip地址的信息

具体使用时我们可以认为ifconf就有两个成员:
ifc_len 
ifc_buf 如图一所示:

  

ifc_len:表示用来存放所有接口信息的缓冲区长度
ifc_buf:
表示存放接口信息的缓冲区

所以我们需要在程序开始时对ifconfifc_lenifc_buf进行初始化 
接下来使用ioctl获取所有接口信息,完成后ifc_len内存放实际获得的接口信息总长度
并且信息被存放在ifc_buf中。 
如下图示:(假设读到两个接口信息)

 

 

接下来我们只需要从一个一个的接口信息获取ip地址信息即可。

下面有一个简单的参考:



点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. #include <sys/ioctl.h>
  7. #include <stdlib.h>
  8. #include <linux/if.h>

  9. int main()
  10. {
  11.     int i=0;
  12.     int sockfd;
  13.     struct ifconf ifconf;
  14.     unsigned char buf[512];
  15.     struct ifreq *ifreq;
  16.     //初始化ifconf
  17.     ifconf.ifc_len = 512;
  18.     ifconf.ifc_buf = buf;
  19.     if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0)
  20.     {
  21.         perror("socket" );
  22.         exit(1);
  23.     }
  24.     ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息
  25.     //接下来一个一个的获取IP地址
  26.     ifreq = (struct ifreq*)buf;
  27.     for (i=(ifconf.ifc_len/sizeof (struct ifreq)); i>0; i--)
  28.     {
  29.         printf("name = [%s]\n" , ifreq->ifr_name);
  30.         printf("local addr = [%s]\n" ,inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
  31.         ifreq++;
  32.     }
  33.     return 0;
  34. }
测试结果:


转载自:http://blog.csdn.net/darennet/article/details/9338819
阅读(4000) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~