获取平台所有接口的IP和MAC地址
我们有时候会有获取网口的IP和MAC地址的需求。可以通过ioctl来获取。
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
void main(void)
{
struct ifreq ifr;
struct ifconf ifc;
char buff[1024];
int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
ifc.ifc_len = sizeof(buff);
ifc.ifc_buf = buff;
ioctl(fd, SIOCGIFCONF, &ifc);//获取所有的网口信息
struct ifreq *it = ifc.ifc_req;
const struct ifreq* const end = it + ifc.ifc_len/sizeof(struct ifreq);
for (; it != end; it++)//遍历网口
{
strncpy(ifr.ifr_name, it->ifr_name, strlen(it->ifr_name) + 1);//网口名称,如“eth0”“ra0”
printf("ifr_name :%s\n", ifr.ifr_name);
if (ioctl(fd, SIOCGIFFLAGS, &ifr) == 0)
{
if (!(ifr.ifr_flags & IFF_LOOPBACK))//忽略lo
{
if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0)//获取MAC
{
unsigned char mac[6];
memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
printf("mac: %02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3], mac[4], mac[5]);
}
if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)//获取IP
{
struct sockaddr_in sin;
memcpy(&sin, &ifr.ifr_addr, sizeof(struct sockaddr_in));
printf("ip: %s\n", inet_ntoa(sin.sin_addr));
}
}
}
}
}
运行结果如下:
最新文章
- IL指令详细表
- java进程CPU飙高
- Jquery 生成时钟
- Android开发之获取相册照片和获取拍照照片
- lucene.net 使用过程中的 几个注意事项(含termquery 和QueryParser 的区别)
- UVa 514 (stack的使用) Rails
- RFID Reader 线路图收集
- Visual Studio C++ Command Line
- W3C盒子与IE盒子模型
- ceph主要数据结构解析2-Rados.h文件
- 修改apk显示或隐藏桌面图标
- 高速掌握sinox2014激动人心的ZFS和RAID技术
- 解决TXT乱码问题
- 创建Sdcard
- 记录一次EF优化
- thinkphp无法加载控制器:Admin
- tex 字体斜体设置
- centos7安装nginx1.10.1
- C语言+嵌入式SQL+DB2开发经验总结
- C# 之 反射性能优化1