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 ...
随机推荐
- 关于Backtracing中有重复元素的处理办法
backtracing是一个常用的解法.之前遇到一个题目,求一个集合的子集, 例如给定{1,2,3,4,5},求其大小为3的子集. 利用backtracing可以较快的给出答案. 然而,该题还有一个变 ...
- hdu 3336 Count the string(思维可水过,KMP)
题目 以下不是KMP算法—— 以下是kiki告诉我的方法,好厉害的思维—— 就是巧用标记,先标记第一个出现的所有位置,然后一遍遍从标记的位置往下找. #include<stdio.h> # ...
- HDU 2473 Junk-Mail Filter(并查集+删点,设立虚父节点/找个代理)
题意:有N封邮件, 然后又两种操作,如果是M X Y , 表示X和Y是相同的邮件.如果是S X,那么表示对X的判断是错误的,X是不属于X当前所在的那个集合,要把X分离出来,让X变成单独的一个.最后问集 ...
- POJ 1456 Supermarket(贪心+并查集优化)
一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2 10 1 20 2 10 1 50+20 50 2 40 ...
- POJ1442Black Box
http://poj.org/problem?id=1442 题意 : 题目中对给出的数字有两种操作ADD(I)操作,将ADD括号里的数字 I 加到数列里边去,然后是自动排好序的,每一个数列前边都会有 ...
- Lambda Action Func练习
namespace lambda { delegate void TestDelegate(string s); class Program { static void Main(string[] a ...
- 从一次面试经历谈PHP的普通传值与引用传值以及unset
关于这个概念一般都会在PHP的第一堂课说变量的时候给介绍,并且我以前还给其他PHPer介绍这个概念.但是作为一个工作一段时间的PHPer的我,竟然在面试的时候一下子拿不定主意最后还答错了,很觉得丢脸( ...
- [@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam
[@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam 转载:http://blog ...
- mysql字段的适当冗余有利于提高查询速度
CREATE TABLE `comment` ( `c_id` int(11) NOT NULL auto_increment COMMENT '评论ID', `u_id` int(11) NOT ...
- 02-语言入门-02-ASCII码排序
题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=4 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个 ...