linux子网的ip怎么获得,Linux下获得网卡MAC地址,IP地址及子网掩码

mac

Linux下获得网卡MAC地址,IP地址及子网掩码

Code

BOOL GetNicInfoForLinux()

{

int skfd = -1, if_cnt = 0, if_idx = 0;;

struct ifreq if_buf[MAX_NET_CARDS];

struct ifconf ifc;

u_int8_t mac_addr[MAC_ADDR_LEN];

u_int32_t ip = 0, netmask = 0;

if_name_index_t if_name_index;

BOOL ip_get = FALSE, netmask_get = FALSE;

struct list_head *ip_info_list = NULL;

if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)

{

LogError("Get NIC info, Create socket error");

return FALSE;

}

ifc.ifc_len = sizeof(if_buf);

ifc.ifc_buf = (char *)if_buf;

if (!ioctl(skfd, SIOCGIFCONF, (char *)&ifc))

{

if_cnt = (ifc.ifc_len) / (sizeof(struct ifreq));

for (if_idx = 0; if_idx < if_cnt; ++if_idx)

{

/* ignore local loopback interface */

if (STRCMP(LOOPBACK_IF_NAME, if_buf[if_idx].ifr_name) == 0)

continue;

/* copy NIC name */

MEMSET(&if_name_index, 0, sizeof(if_name_index_t));

STRCPY(if_name_index.if_name, if_buf[if_idx].ifr_name);

/* get interface flags */

if (!(ioctl(skfd, SIOCGIFFLAGS, (char *)(&if_buf[if_idx]))))

{

/* this interface is up and running */

if ((if_buf[if_idx].ifr_flags & IFF_UP) &&

(if_buf[if_idx].ifr_flags & IFF_RUNNING))

{

if (!(ioctl(skfd, SIOCGIFHWADDR, (char *)(&if_buf[if_idx]))))

{

MEMCPY(mac_addr, (char *)(&(if_buf[if_idx].ifr_hwaddr.sa_data)), MAC_ADDR_LEN);

/* add new NIC */

ip_info_list = AddNicToNewNicInfoList(mac_addr, MAC_ADDR_LEN, &if_name_index, &g_newNicInfoList);

}

/* get ip address of this NIC */

if (!(ioctl(skfd, SIOCGIFADDR, (char *)(&if_buf[if_idx]))))

{

ip = ((struct sockaddr_in *)(&(if_buf[if_idx].ifr_addr)))->sin_addr.s_addr;

ip_get = TRUE;

}

/* get ip netmask */

if (!(ioctl(skfd, SIOCGIFNETMASK, (char *)(&if_buf[if_idx]))))

{

netmask = ((struct sockaddr_in *)(&(if_buf[if_idx].ifr_netmask)))->sin_addr.s_addr;

netmask_get = TRUE;

}

/* insert ip to ip list */

if ((TRUE == ip_get) && (TRUE == netmask_get))

{

AddIpToIpList(ip, netmask, ip_info_list);

ip_get = FALSE;

netmask_get = FALSE;

}

}

}

} /* end of for (if_idx = 0; if_idx < if_cnt; ++if_idx) */

}

close(skfd);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值