天天看點

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 結構體分析和使用 及其在項目中的簡單應用

繼續閱讀