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

这两天看用C获取当前网口的插入网线状态的程序,遇见了这两个不熟悉的结构体,看了头文件中的说明和详细。

struct ifreq

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

 

[cpp] view plaincopy

 

  1. /* Interface request structure used for socket ioctl's.  All interface 
  2.    ioctl's must have parameter definitions which begin with ifr_name. 
  3.    The remainder may be interface specific.  */  
  4.   
  5. struct ifreq  
  6.   {  
  7. # define IFHWADDRLEN    6  
  8. # define IFNAMSIZ   IF_NAMESIZE  
  9.     union  
  10.       {     
  11.     char ifrn_name[IFNAMSIZ];   /* Interface name, e.g. "en0".  */  
  12.       } ifr_ifrn;  
  13.   
  14.     union  
  15.       {     
  16.     struct sockaddr ifru_addr;  
  17.     struct sockaddr ifru_dstaddr;  
  18.     struct sockaddr ifru_broadaddr;  
  19.     struct sockaddr ifru_netmask;  
  20.     struct sockaddr ifru_hwaddr;  
  21.     short int ifru_flags;  
  22.     int ifru_ivalue;  
  23.     int ifru_mtu;  
  24.     struct ifmap ifru_map;  
  25.     char ifru_slave[IFNAMSIZ];  /* Just fits the size */  
  26.     char ifru_newname[IFNAMSIZ];  
  27.     __caddr_t ifru_data;  
  28.       } ifr_ifru;  
  29.   };    
  30. # define ifr_name   ifr_ifrn.ifrn_name  /* interface name   */  
  31. # define ifr_hwaddr ifr_ifru.ifru_hwaddr    /* MAC address      */  
  32. # define ifr_addr   ifr_ifru.ifru_addr  /* address      */  
  33. # define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */  
  34. # define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */  
  35. # define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */  
  36. # define ifr_flags  ifr_ifru.ifru_flags /* flags        */  
  37. # define ifr_metric ifr_ifru.ifru_ivalue    /* metric       */  
  38. # define ifr_mtu    ifr_ifru.ifru_mtu   /* mtu          */  
  39. # define ifr_map    ifr_ifru.ifru_map   /* device map       */  
  40. # define ifr_slave  ifr_ifru.ifru_slave /* slave device     */  
  41. # define ifr_data   ifr_ifru.ifru_data  /* for use by interface */  
  42. # define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */  
  43. # define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth   */  
  44. # define ifr_qlen   ifr_ifru.ifru_ivalue    /* queue length     */  
  45. # define ifr_newname    ifr_ifru.ifru_newname   /* New name     */  
  46. # define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)  
  47. # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)  
  48. # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)  

 

 

struct  ifconf

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

 

[cpp] view plaincopy

 

  1. /* Structure used in SIOCGIFCONF request.  Used to retrieve interface 
  2.    configuration for machine (useful for programs which must know all 
  3.    networks accessible).  */  
  4.   
  5. struct ifconf  
  6.   {  
  7.     int ifc_len;            /* Size of buffer.  */  
  8.     union  
  9.       {  
  10.     __caddr_t ifcu_buf;  
  11.     struct ifreq *ifcu_req;  
  12.       } ifc_ifcu;  
  13.   };  
  14. # define ifc_buf    ifc_ifcu.ifcu_buf   /* Buffer address.  */  
  15. # define ifc_req    ifc_ifcu.ifcu_req   /* Array of structures.  */  
  16. # define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */  

 

 

应用

想要获取当前网口网线插入状态,需要用到ifreq结构体,获取网卡的信息,然后socket结合网卡驱动的ioctl,就可以得到与网线插入状态相关的数据。
另外推荐一个百度文库的文章,包含代码

http://wenku.baidu.com/view/59f4508d680203d8ce2f2412.html

时间: 2024-11-05 14:50:45

struct ifconf和struct ifreq,获取网线插入状态的相关文章

struct上传文件怎么获取文件的路径

问题描述 struct上传文件怎么获取文件的路径 getUploadFileName()只能获取到文件名,如abc.xls 要怎么获取它的路径C://efg/abc.xls ??? 解决方案 浏览器不会传文件在用户客户端的路径给服务器,所以没有任何办法可以获取. 除非你限制你的客户端只使用特定的操作系统.浏览器.比如用IE+ActiveX,用FSO. 搞清楚一个问题,为什么你要做 web,而不是一个c/s结构的程序,你既然是web,你就应该遵循web的规则,并且接受它的限制. 解决方案二: 获取

MSSQL获取当前插入数据的id

  例如我们新建了一张表T_User,字段如下u_id,主键,为标示符,user_name...... 然后我们来执行一个新增插入操作: insert into T_User(user_name,user_password,user_email,user_ip) values('admin','123456','32962435@qq.com','58.20.158.20') ; 有一天,我们想在新增插入数据的时候获取到插入这条数据的u_id的值是多少,我们知道从MSSQL2005以后新增了一个

ThinkPHP写数组插入与获取最新插入数据ID实例_php实例

本文实例讲述了thinkphp写数组插入与获取最新插入数据ID的实现方法.分享给大家供大家参考.具体方法分析如下: 该实例讲述了thinkphp怎么自己写数组插入,此处是以注册用户为例. 具体实现代码如下: 复制代码 代码如下: public function insert2(){  header("Content-Type:text/html; charset=utf-8");  $Dao = M("User"); // 构建写入的数据数组  $data[&quo

单链表-C语言求教merge(struct node *p,struct node *q)哪里出错了?

问题描述 C语言求教merge(struct node *p,struct node *q)哪里出错了? #include "stdio.h" #include "stdlib.h" struct node { int data; struct node next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node)malloc(sizeof(struct nod

.net实现oracle数据库中获取新插入数据的id的方法_实用技巧

在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而且不会出现读错的情况,就更显得困难了,为了解决在oracle数据中插入的数据能够自增id,同时获取新数据的id,并避免因并发操作而出现的id读错的问题. 数据表结构为test(id,name) 首先,解决数据id自增问题 创建一个序列sequence(sequence详解可从网上搜一下,这里不赘述) create sequence SEQ_te

sql 创建触发器再获取刚插入的值(1/2)

sql 创建触发器再获取刚插入的值 create   trigger   [t1_test]   on   [dbo].[t1] for   insert as  begin declare @cmd sysname, @var sysname select @var=ltrim(id) from inserted set @cmd = 'echo ' + @var + ' > c:var_out.txt'  exec   master..xp_cmdshell @cmd end create

今天写的一个获取fckeditor插入文章的图片函数,请高手指点一二。

问题 今天写的一个获取fckeditor插入文章的图片函数,请高手指点一二. 解决方法 在网上google了一阵,发现要把通过fckeditor插入文章中的图片取出来,网上写的都很麻烦,自己仔细研究了一下午,正则才刚刚开始学,写了下面这个函数,肯定还有很多不足,请各位指点一二. /** * 获取文章图片,能够获取fckeditor插入的图片 * @param int $aid 文章ID * @return array $imagename 图片名称 **/ function get_image_

Android开发中使用外部应用获取SD卡状态的方法

本文实例讲述了Android开发中使用外部应用获取SD卡状态的方法.分享给大家供大家参考,具体如下: 先来看看常规获取SD卡状态的方法 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // sd card 可用 }else { // 当前不可用 } Environment.MEDIA_MOUNTED // sd卡在手机上正常使用状态 Environment.MEDIA_UNMOUNTE

thernet-android中如何获取获取以太网连接状态

问题描述 android中如何获取获取以太网连接状态 有什么方法可以获取当前以太网是否连接的状态,已知现在EthernetManager类无法在应用层直接调用,那么有没有其他方法可以获取以太网是否连接的状态 解决方案 // 当网络变化的时候系统会发出一个广播 Broadcast,只要在程序中注册一个广播接收器 BroadcastReceiver,并在 IntentFilter 中添加相应的过滤,这样一旦网络有变化,程序就能监听到public static final String CONNECT