天天看点

Linux中ifreq 结构体分析和使用 及其在项目中的简单应用

[基础知识说明]

结构原型:

/*

 * Interface request structure used for socket

 * ioctl's.  All interface ioctl's must have parameter

 * definitions which begin with ifr_name.  The

 * remainder may be interface specific.

 */

struct ifreq 

{

#define IFHWADDRLEN 6

 union

 {

  char ifrn_name[IFNAMSIZ];  /* if name, e.g. "en0" */

 } ifr_ifrn;

 union {

  struct sockaddr ifru_addr;

  struct sockaddr ifru_dstaddr;

  struct sockaddr ifru_broadaddr;

  struct sockaddr ifru_netmask;

  struct  sockaddr ifru_hwaddr;

  short ifru_flags;

  int ifru_ivalue;

  int ifru_mtu;

  struct  ifmap ifru_map;

  char ifru_slave[IFNAMSIZ]; /* Just fits the size */

  char ifru_newname[IFNAMSIZ];

  void __user * ifru_data;

  struct if_settings ifru_settings;

 } ifr_ifru;

};

#define ifr_name ifr_ifrn.ifrn_name /* interface name  */

#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address   */

#define ifr_addr ifr_ifru.ifru_addr /* address  */

#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */

#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */

#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */

#define ifr_flags ifr_ifru.ifru_flags /* flags  */

#define ifr_metric ifr_ifru.ifru_ivalue /* metric  */

#define ifr_mtu  ifr_ifru.ifru_mtu /* mtu   */

#define ifr_map  ifr_ifru.ifru_map /* device map  */

#define ifr_slave ifr_ifru.ifru_slave /* slave device  */

#define ifr_data ifr_ifru.ifru_data /* for use by interface */

#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */

#define ifr_bandwidth ifr_ifru.ifru_ivalue    /* link bandwidth */

#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length  */

#define ifr_newname ifr_ifru.ifru_newname /* New name  */

#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/

基本介绍: 

ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。

举例说明:

在Linux系统中,ifconfig命令是通过ioctl接口与内核通信,例如,当系统管理员输入如下命令来改变接口eth0的MTU大小:

    ifconfig eth0 mtu 1250

ifconfig命令首先打开一个socket,然后通过系统管理员输入的参数初始化一个数据结构,并通过ioctl调用将数据传送到内核。SIOCSIFMTU是命令标识符。

    struct ifreq data;

    fd = socket(PF_INET, SOCK_DGRAM, 0);

    < ... initialize "data" ...>

    err = ioctl(fd, SIOCSIFMTU, &data);

[举例应用]

Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用

参考H CPP文件

Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用

继续阅读