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 ...
随机推荐
- sql 判断两个时间段是否有交集
本文转自CSDN 链接地址:http://blog.csdn.net/dasihg/article/details/8450195 时间段:starttime_1到endtime_1,starttim ...
- poj 1026 Cipher
置换群就可以搞定!!! 注意下格式就好了…… #include<iostream> #include<stdio.h> #include<algorithm> #i ...
- Spring 与 Hibernate 集成 Transactional设置为只读
@Transactional标签用于标记ServiceImpl使用事务,并且能够打开一个sessionFactory的session,并且打开事务. 如果在这个标签为@Transactional(pr ...
- C语言的字符测试函数
C语言的字符测试函数 isalnum, isalpha, isdigit, isxdigit, isblank, isspace, isascii, iscntrl, ispunct, isgraph ...
- Linux功能-RPM命令详解
一.概述 RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”,用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布 ...
- java web 下实现文件下载
来自:http://blog.csdn.net/longshengguoji/article/details/39433307 需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法 ...
- ios越狱开发第一次尝试记录
1.THEOS的makefile文件中的THEOS_DEVICE_IP要写在第一行 2.如果make package install报错 dpkg status database is locked ...
- bash: ./device/nexell/tools/build.sh: 权限不够
/bin/bash: build/tools/diff_package_overlays.py: 鏉冮檺涓嶅 i686-linux-gcc: error trying to exec 'cc1': ...
- TCSRM 591 div2(1000)(dp)
挺好的dp 因为有一点限制 必须任意去除一个数 总和就会小于另一个总和 换句话来说就是去除最小的满足 那么就都满足 所以是限制最小值的背包 刚开始从小到大定住最小值来背 TLE了一组数据 后来发现如果 ...
- poj3207 Ikki’s Story IV – Panda’s Trick
2-SAT. tarjan缩点.强连通分量的点要选一起选. #include<cstdio> #include<algorithm> #include<cstring&g ...