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 ...
随机推荐
- POJ 1363 Rails(栈)
思路:将出车站的顺序存入数组train,由于入车站的顺序是固定的,为1~N,所以用P表示进站的车,初始为1. 接下来举例说明吧: 原来入站顺序: 1 2 3 4 5 读入的出战顺序: 3 4 2 ...
- 在C#中调用另一个应用程序或命令行(.exe 带参数)<zz>
在.net中使用system.diaglostics.Process可以用来调用另一个命令行或程序. using System.Diagnostics; 如果是dos Proces ...
- hdu 4447 Yuanfang, What Do You Think?
思路: 这题有个结论也可以自己归纳: 对于给定的n,其约数用pi表示 T(n)=T(p1)T(p2)……T(pn)T(n') 其中T(n')是这个式子所独有的也就是 T(n')=(x^n-1)/T(p ...
- hdu1116
http://acm.hdu.edu.cn/showproblem.php?pid=1116 #include<stdio.h> #include<math.h> #inclu ...
- Ubuntu 装JDK
我是按照这篇文章安装jdk的: http://www.cnblogs.com/bluestorm/archive/2012/05/10/2493592.html 先去 Oracle下载Linux下 ...
- [Unity菜鸟] Time
1. Time.deltaTime 增量时间 以秒计算,完成最后一帧的时间(秒)(只读) 帧数所用的时间不是你能控制的.每一帧都不一样,游戏一般都是每秒60帧,也就是updata方法调用60次(假如你 ...
- NSArray 利用数组创建数组
NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3", nil]; ...
- Android Cursor空指针的问题
最近几天无聊自己动手写个音乐播放器,用到Cursor来取得数据库中音乐文件的信息,但是当用到Cursor的时候总是报空指针错误,后来发现是模拟器上没有音乐文件,使用Cursor的时候 ,若Cursor ...
- 转TransactionProxyFactoryBean代理事务
<?xml version="1.0" encoding="GBK"?> <!-- 指定Spring配置文件的DTD信息 --> < ...
- BZOJ 2299 向量
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2299 题意:给出一对数a,b,任意使用(a,b), (a,-b), (-a,b), (- ...