struct ifreq 的用法详解

1、结构定义

struct ifreq
{
#define IFHWADDRLEN 6
 union
 {
  char ifrn_name[IFNAMSIZ];  
 } 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]; 
  char ifru_newname[IFNAMSIZ];
  void __user * ifru_data;
  struct if_settings ifru_settings;
 } ifr_ifru;
};
#define ifr_name ifr_ifrn.ifrn_name 
#define ifr_hwaddr ifr_ifru.ifru_hwaddr 
#define ifr_addr ifr_ifru.ifru_addr 
#define ifr_dstaddr ifr_ifru.ifru_dstaddr 
#define ifr_broadaddr ifr_ifru.ifru_broadaddr 
#define ifr_netmask ifr_ifru.ifru_netmask 
#define ifr_flags ifr_ifru.ifru_flags 
#define ifr_metric ifr_ifru.ifru_ivalue 
#define ifr_mtu  ifr_ifru.ifru_mtu 
#define ifr_map  ifr_ifru.ifru_map 
#define ifr_slave ifr_ifru.ifru_slave 
#define ifr_data ifr_ifru.ifru_data 
#define ifr_ifindex ifr_ifru.ifru_ivalue 
#define ifr_bandwidth ifr_ifru.ifru_ivalue    
#define ifr_qlen ifr_ifru.ifru_ivalue 
#define ifr_newname ifr_ifru.ifru_newname 
#define ifr_settings ifr_ifru.ifru_settings 

struct ifconf 
{
	int ifc_len; /* size of buffer    */
	union 
	{
		char *ifcu_buf; /* input from user->kernel*/
		struct ifreq *ifcu_req; /* return from kernel->user*/
	} ifc_ifcu;
};


2、用法说明

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

3、获取网络信息

static int get_net_info(const char *eth_name, uint32_t *ipaddr, uint32_t *netmask, uint32_t *gateway, uint32_t *bcast_addr)
{
	int skfd = -1;
	struct ifreq ifr;

	skfd = socket(PF_INET, SOCK_DGRAM, 0);
	if (skfd < 0)
	{
		return -1;
	}

	if(eth_name == NULL)
	{
		strcpy(ifr.ifr_name, "eth0");
	}
	else
	{
		strcpy(ifr.ifr_name, eth_name);
	}

	if (ioctl(skfd, SIOCGIFADDR, &ifr) == 0)
	{
		*ipaddr = ((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr.s_addr;
	}
	if (ioctl(skfd, SIOCGIFNETMASK, &ifr) == 0)
	{
		*netmask = ((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr.s_addr;
	}

	if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) == 0)
	{
		*bcast_addr = ((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr.s_addr;
	}

	close(skfd);

	if (eth_name == NULL)
	{
		get_gateway(gateway);
	}
	else
	{
		if(strcmp(eth_name, ETH0) == 0)
		{
			*gateway = inet_addr(sysconfig_get_value("net", "gateway"));
		}
		else
		{
			*gateway = inet_addr(sysconfig_get_value("net", "gateway2"));
		}
	}

	return 0;
}



  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值