ioctl()获取本地网卡设备信息
获得eth0接口所有信息:
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <net/if.h>
- #include <string.h>
- unsigned char g_eth_name[16];
- unsigned char g_macaddr[16];
- unsigned int g_subnetmask;
- unsigned int g_ipaddr;
- unsigned int g_broadcast_ipaddr;
- //初始化网络,获取当前网络设备信息
- void init_net(void)
- {
- int i ;
- int sock;
- struct sockaddr_in sin;
- struct ifreq ifr;
- sock=socket(AF_INET, SOCK_DGRAM, 0);
- if(sock==-1)
- perror("socket");
- strcpy(g_eth_name, "eth0");
- strcpy(ifr.ifr_name, g_eth_name);
- printf("eth name:\t%s\n", g_eth_name);
- //获取并打印网卡地址
- if(ioctl(sock, SIOCGIFHWADDR, &ifr) <0 )
- perror("ioctl error\n");
- memcpy(g_macaddr, ifr.ifr_hwaddr.sa_data, 6);
- printf("local mac:\t");
- for(i=0;i<5;i++)
- printf("%.2x:", g_macaddr[i]);
- printf("%.2x\n", g_macaddr[i]);
- //获取并打印IP地址
- if(ioctl(sock, SIOCGIFADDR, &ifr)<0)
- perror("ioctl error\n");
- memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
- g_ipaddr = sin.sin_addr.s_addr;
- printf("local eth0:\t%s\n", inet_ntoa(sin.sin_addr));
- //获取并打印广播地址
- if(ioctl(sock, SIOCGIFBRDADDR, &ifr)<0)
- perror("ioctl error\n");
- memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
- g_broadcast_ipaddr = sin.sin_addr.s_addr;
- printf("broadcast:\t%s\n", inet_ntoa(sin.sin_addr));
- //获取并打印子网掩码
- if(ioctl(sock,SIOCGIFNETMASK,&ifr)<0)
- perror("ioctl error\n");
- memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
- g_subnetmask = sin.sin_addr.s_addr;
- printf("subnetmask:\t%s\n", inet_ntoa(sin.sin_addr));
- close(sock);
- }
- int main()
- {
- //initialize
- init_net();
- //do something
- //....
- return 0;
- }
获取所有IP:
- #include <string.h>
- #include <sys/ioctl.h>
- #include <sys/socket.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <linux/if.h>
- #include <arpa/inet.h>
- int main()
- {
- int i=0;
- int sockfd;
- struct ifconf ifconf;
- unsigned char buf[512];
- struct ifreq *ifreq;
- //初始化ifconf
- ifconf.ifc_len = 512;
- ifconf.ifc_buf = buf;
- if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- {
- perror("socket open failure!\n" );
- exit(1);
- }
- ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息
- //接下来一个一个的获取IP地址
- ifreq = (struct ifreq*)buf;
- for (i=(ifconf.ifc_len/sizeof (struct ifreq)); i>0; i--)
- {
- if(ifreq->ifr_flags == AF_INET)
- {
- printf("name = [%s] " , ifreq->ifr_name);
- printf("local addr = [%s]",
- inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
- printf();
- ifreq++;
- }
- }
- return 0;
- }
- /* 得到本机的mac地址和ip地址 */
- int GetLocalMac ( const char *device,char *mac,char *ip )
- {
- int sockfd;
- struct ifreq req;
- struct sockaddr_in * sin;
- if ( ( sockfd = socket ( PF_INET,SOCK_DGRAM,0 ) ) ==-1 )
- {
- fprintf ( stderr,"Sock Error:%s\n\a",strerror ( errno ) );
- return ( -1 );
- }
- memset ( &req,0,sizeof ( req ) );
- strcpy ( req.ifr_name,device );
- if ( ioctl ( sockfd,SIOCGIFHWADDR, ( char * ) &req ) ==-1 )
- {
- fprintf ( stderr,"ioctl SIOCGIFHWADDR:%s\n\a",strerror ( errno ) );
- close ( sockfd );
- return ( -1 );
- }
- memcpy ( mac,req.ifr_hwaddr.sa_data,6 );
- req.ifr_addr.sa_family = PF_INET;
- if ( ioctl ( sockfd,SIOCGIFADDR, ( char * ) &req ) ==-1 )
- {
- fprintf ( stderr,"ioctl SIOCGIFADDR:%s\n\a",strerror ( errno ) );
- close ( sockfd );
- return ( -1 );
- }
- sin = ( struct sockaddr_in * ) &req.ifr_addr;
- memcpy ( ip, ( char * ) &sin->sin_addr,4 );
- return ( 0 );
- }
ioctl()获取本地网卡设备信息的更多相关文章
- 获取本地IP地址信息
2012-06-05 /// <summary> /// 获取本地IP地址信息 /// </summary> void G ...
- IOS 获取更多的设备信息
● 如果想获得更多的设备信息,比如 ● 设备型号.CPU情况.内存使用情况.硬盘使用情况 ● 是否越狱.装了哪些传感器.当前运行的进程 ● ... ... ● 有2种方法获取更多的设备信息 ...
- 在有多个网卡,配置了多个IP的情况下,python 获取本地网卡的主IP
如图所示有多个网卡 本地网卡配置了多个IP class Public_IPOp: @staticmethod def GetLocalIP(): rt = [False] # 根节点 reg_root ...
- IOS 特定于设备的开发:获取额外的设备信息
sysctl()和sysctlbyname()允许获取系统信息.这些标准的UNIX函数用于询问操作系统有关硬件和OS的详细信息. 这些常量使你能够检查核心信息,比如系统的CPU频率,可用的内存量等.它 ...
- 获取本地的jvm信息,进行图形化展示
package test1; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCol ...
- C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终 ...
- appium自动化测试框架——封装获取设备信息类
在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...
- Linux下编程获取本地IP地址的常见方法
转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之 ...
- LINUX - 获取本地ip
Linux编程获取本机IP地址的几种方法 参考: https://blog.csdn.net/zhongmushu/article/details/89944990 https://www.cnblo ...
随机推荐
- Oracle 体系结构2 - 共享和专用服务器
1. 怎么查看自己的oracle是共享还是专用服务器 2. 怎么修改设置 3.各有什么优缺点 4.适用环境 对于专用服务器,每一个数据库连接,oracle都会分配一个专门的进程为其服务 oracle@ ...
- [2-sat]HDOJ1824 Let's go home
中问题 题意略 和HDOJ 3062一样 这里 每个队员都有 选 和 不选 两种, 即 上篇所说的$x$和$x’$ 建图:队长(a)留下或者其余两名队员(b.c)同时留下 那么就是$a' \Right ...
- TopCoder 603 div1 & div2
div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...
- Java中Integer的源码学习
一.开始 public final class Integer extends Number implements Comparable<Integer> 1).由于类修饰符中有关键字 ...
- HEOI2016游记
DAY -1: 省选前集训因为某些事情感觉心情和状态异常的糟糕 坐在窗户上吹了半个小时的冷风之后觉得回家休息一段时间 (反正我家在保定,大不了我省选的时候直接去河北大学就好辣) 在家里颓了三天吧,想清 ...
- lintcode 中等题:Submatrix sum is 0 和为零的子矩阵
和为零的子矩阵 给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标. 样例 给定矩阵 [ [1 ,5 ,7], [3 ,7 ,-8], [4 ,-8 ...
- 【mysql的编程专题①】流程控制与其他语法
流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中; 如果用在select上就会随着query出来的row来隐式迭代; 注释与语句结束符 语句结束符 默认有两 ...
- Linux资源监控命令/工具(综合)
目录: ps pstree pidof top free uptime ifuser lsof mpstat vmstst pidstat iostat iotop watch sar 1.ps 1) ...
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
- C++:虚基类
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...