通过使用ioctl可以获得本机的一些信息,这里记录获得interface IP及MAC的过程。

1:ioctl 函数的作用是什么

man ioctl:

DESCRIPTION
The ioctl() function manipulates the underlying device parameters of special files. In particular, many operating characteris‐
tics of character special files (e.g., terminals) may be controlled with ioctl() requests. The argument fd must be an open file
descriptor.

The second argument is a device-dependent request code. The third argument is an untyped pointer to memory. It's traditionally
char *argp (from the days before void * was valid C), and will be so named for this discussion.

An ioctl() request has encoded in it whether the argument is an in parameter or out parameter, and the size of the argument argp
in bytes. Macros and defines used in specifying an ioctl() request are located in the file <sys/ioctl.h>.

2:测试例子

/*
用socket获得当前interface的信息
1:ip地址
2:mac地址
3:interface index
注:创建的是原始套接字,编译及执行都需要root权限
*/
int read_interface(const char* interface)
{
int fd;
int ret = ;
struct ifreq ifr;
struct sockaddr_in *ip_addr = NULL;
char mac[] = {};
memset(&ifr, , sizeof(struct ifreq));
fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (fd > ){
ifr.ifr_addr.sa_family = AF_INET;
strcpy(ifr.ifr_name, interface); //get interface ip
if(ioctl(fd, SIOCGIFADDR, &ifr) == ){
ip_addr = (struct sockaddr_in *)&ifr.ifr_addr;
printf("The %s ip addr is %s\n",ifr.ifr_name,inet_ntoa(ip_addr->sin_addr));
} else {
printf("SIOCGIFADDR failed, error:%s\n", strerror(errno));
ret = -;
goto out;
} //get interface mac
if(ioctl(fd, SIOCGIFHWADDR, &ifr) == ){
memcpy(mac, ifr.ifr_hwaddr.sa_data, );
printf("interface mac: %02X:%02X:%02X:%02X:%02X:%02X\n",
mac[],mac[],mac[],mac[],mac[],mac[]);
} else {
printf("SIOCGIFHWADDR failed, error:%s\n", strerror(errno));
ret = -;
goto out;
} //get interface index
if (ioctl(fd, SIOCGIFINDEX, &ifr) == ) {
printf("The interface index:%d\n",ifr.ifr_ifindex);
} else {
printf("SIOCGIFINDEX failed, error:%s\n", strerror(errno));
ret = -;
goto out;
}
} else {
printf("%s\n",strerror(errno));
ret = -;
}
out:
close(fd);
return ret;
}

3:ioctl的第二个参数有很多,了解它们可以在需要时使用

参考:http://blog.csdn.net/evenness/article/details/7665970

  

ioctrl 获取本机IP及MAC地址的更多相关文章

  1. 获取本机IP、mac地址、计算机名

    python获取本机IP.mac地址.计算机名 在python中获取ip地址和在php中有很大不同,我们先来看一下python 获得本机MAC地址: >>> import uuid ...

  2. python获取本机IP、mac地址、计算机名

    在python中获取ip地址和在php中有很大不同,在php中往往比较简单.那再python中怎么做呢? 我们先来看一下python 获得本机MAC地址: 1 2 3 4 import uuid de ...

  3. Linux 获取本机IP、MAC地址用法大全

    getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...

  4. JAVA获取本机IP和Mac地址

       在项目中,时常需要获取本机的Ip或是Mac地址,进行身份和权限验证,本文就是通过java代码获取ip和Mac. package com.svse.query;import java.net.In ...

  5. QT获取本机IP和Mac地址

    #include <QNetworkInterface> #include <QList> void MainWindow::getIPPath() { QString str ...

  6. java 获取本机ip及mac地址

    package com.achun.test; import java.net.Inet4Address;import java.net.Inet6Address;import java.net.In ...

  7. c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存

    我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...

  8. win32 获取本机网卡信息(MAC地址,IP地址等)

    由于一个需求需要获取网卡的MAC地址,就搜了一下,大部分都是COPY来COPY去的一些代码,有很多甚至不能直接运行或有还有内存泄漏.自己查了一下MSDN然后封装了一下: 需要注意,一个机器可能有多个网 ...

  9. node.js获取本机Ip, hostName, mac

    //获取ip地址 getIPAdress() { let interfaces = require('os').networkInterfaces(); for (var devName in int ...

随机推荐

  1. javascript对table的添加,删除行的操作

    <body> <form name="myForm"> <table width="100%" id="tab" ...

  2. Python3 数据类型-集合

    在Python中集合set是基本数据类型的一种,它有可变集合(set)和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法. 集合 ...

  3. 正确使用memset

    今天做了一道素数打表的题我在使用一个数组记录是否为素数的时候使用了memset,将数组里面的数都清为1,代表是素数,不是素数,就改成0,我在判断这一个数是否为素数是依据也是是0还是1,结果一直存在问题 ...

  4. Java实验二实验报告:java面向对象程序设计

    java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验 ...

  5. JDK中的泛型

    Java中的泛型介绍: 起因: 1. JDK 1.4 以前类型不明确: ① 装入集合的对象被当作 Object 类型对待,从而失去了自己的原有类型: ② 从集合中取出时往往需要转型,效率低下,并且容易 ...

  6. ACM 第一天

    标签库元素: 队列<queue> FIFO 栈 <stack>  FICO 集合 set 不定长数组  vector 映射 map Maximum Multiple Time ...

  7. LintCode-211.字符串置换

    字符串置换 给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换. 置换的意思是,通过改变顺序可以使得两个字符串相等. 样例 "abc" 为 "cb ...

  8. CentOS 7 开放防火墙端口

    我:最近在使 CentOS 7时发现在本地不能访问linux上8080端口,以上是我的操作,修改后访问成功 CentOS 7 开放防火墙端口 命令 最近公司新的server要求用CentOS7, 发现 ...

  9. CentOS 文件及目录等

    1.在linux中一切皆是文件,只是类型不同,通过ls -l看到的一个字母表示文件的类型 -:普通文件. d:目录文件. l:链接文件. b:块设备文件. c:字符设备文件. p:管道文件. 2.文件 ...

  10. 【题解】51nod1327 棋盘游戏

    那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...