ioctl()获取本地网卡设备信息

获得eth0接口所有信息:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <net/if.h>
  11. #include <string.h>
  12. unsigned char g_eth_name[16];
  13. unsigned char g_macaddr[16];
  14. unsigned int g_subnetmask;
  15. unsigned int g_ipaddr;
  16. unsigned int g_broadcast_ipaddr;
  17. //初始化网络,获取当前网络设备信息
  18. void init_net(void)
  19. {
  20. int i ;
  21. int sock;
  22. struct sockaddr_in sin;
  23. struct ifreq ifr;
  24. sock=socket(AF_INET, SOCK_DGRAM, 0);
  25. if(sock==-1)
  26. perror("socket");
  27. strcpy(g_eth_name, "eth0");
  28. strcpy(ifr.ifr_name, g_eth_name);
  29. printf("eth name:\t%s\n", g_eth_name);
  30. //获取并打印网卡地址
  31. if(ioctl(sock, SIOCGIFHWADDR, &ifr) <0 )
  32. perror("ioctl error\n");
  33. memcpy(g_macaddr, ifr.ifr_hwaddr.sa_data, 6);
  34. printf("local mac:\t");
  35. for(i=0;i<5;i++)
  36. printf("%.2x:", g_macaddr[i]);
  37. printf("%.2x\n", g_macaddr[i]);
  38. //获取并打印IP地址
  39. if(ioctl(sock, SIOCGIFADDR, &ifr)<0)
  40. perror("ioctl error\n");
  41. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  42. g_ipaddr = sin.sin_addr.s_addr;
  43. printf("local eth0:\t%s\n", inet_ntoa(sin.sin_addr));
  44. //获取并打印广播地址
  45. if(ioctl(sock, SIOCGIFBRDADDR, &ifr)<0)
  46. perror("ioctl error\n");
  47. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  48. g_broadcast_ipaddr = sin.sin_addr.s_addr;
  49. printf("broadcast:\t%s\n", inet_ntoa(sin.sin_addr));
  50. //获取并打印子网掩码
  51. if(ioctl(sock,SIOCGIFNETMASK,&ifr)<0)
  52. perror("ioctl error\n");
  53. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  54. g_subnetmask = sin.sin_addr.s_addr;
  55. printf("subnetmask:\t%s\n", inet_ntoa(sin.sin_addr));
  56. close(sock);
  57. }
  58. int main()
  59. {
  60. //initialize
  61. init_net();
  62. //do something
  63. //....
  64. return 0;
  65. }

获取所有IP:

  1. #include <string.h>
  2. #include <sys/ioctl.h>
  3. #include <sys/socket.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <linux/if.h>
  7. #include <arpa/inet.h>
  8. int main()
  9. {
  10. int i=0;
  11. int sockfd;
  12. struct ifconf ifconf;
  13. unsigned char buf[512];
  14. struct ifreq *ifreq;
  15. //初始化ifconf
  16. ifconf.ifc_len = 512;
  17. ifconf.ifc_buf = buf;
  18. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  19. {
  20. perror("socket open failure!\n" );
  21. exit(1);
  22. }
  23. ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息
  24. //接下来一个一个的获取IP地址
  25. ifreq = (struct ifreq*)buf;
  26. for (i=(ifconf.ifc_len/sizeof (struct ifreq)); i>0; i--)
  27. {
  28. if(ifreq->ifr_flags == AF_INET)
  29. {
  30. printf("name = [%s] " , ifreq->ifr_name);
  31. printf("local addr = [%s]",
  32. inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
  33. printf();
  34. ifreq++;
  35. }
  36. }
  37. return 0;
  38. }

获取本机的IP和MAC地址:

  1. /* 得到本机的mac地址和ip地址 */
  2. int GetLocalMac ( const char *device,char *mac,char *ip )
  3. {
  4. int sockfd;
  5. struct ifreq req;
  6. struct sockaddr_in * sin;
  7. if ( ( sockfd = socket ( PF_INET,SOCK_DGRAM,0 ) ) ==-1 )
  8. {
  9. fprintf ( stderr,"Sock Error:%s\n\a",strerror ( errno ) );
  10. return ( -1 );
  11. }
  12. memset ( &req,0,sizeof ( req ) );
  13. strcpy ( req.ifr_name,device );
  14. if ( ioctl ( sockfd,SIOCGIFHWADDR, ( char * ) &req ) ==-1 )
  15. {
  16. fprintf ( stderr,"ioctl SIOCGIFHWADDR:%s\n\a",strerror ( errno ) );
  17. close ( sockfd );
  18. return ( -1 );
  19. }
  20. memcpy ( mac,req.ifr_hwaddr.sa_data,6 );
  21. req.ifr_addr.sa_family = PF_INET;
  22. if ( ioctl ( sockfd,SIOCGIFADDR, ( char * ) &req ) ==-1 )
  23. {
  24. fprintf ( stderr,"ioctl SIOCGIFADDR:%s\n\a",strerror ( errno ) );
  25. close ( sockfd );
  26. return ( -1 );
  27. }
  28. sin = ( struct sockaddr_in * ) &req.ifr_addr;
  29. memcpy ( ip, ( char * ) &sin->sin_addr,4 );
  30. return ( 0 );
  31. }
时间: 2024-10-31 19:28:22

ioctl()获取本地网卡设备信息的相关文章

Powershell 获取本地组成员信息

工作当中需要查看本地组成员信息,从网上看到使用net localgroup 命令可以实现本地组成员信息,经过再加工得到如下信息,备忘至此! $localgroups = "Administrators","Remote Desktop Users" $result = @()foreach($group in $localgroups){$groupmembers = net localgroup $groupforeach($member in $groupmem

IOS 特定于设备的开发:获取额外的设备信息

sysctl()和sysctlbyname()允许获取系统信息.这些标准的UNIX函数用于询问操作系统有关硬件和OS的详细信息. 这些常量使你能够检查核心信息,比如系统的CPU频率,可用的内存量等.它引入了一个UIDevice类,用于搜集系统信息,并通过一系列方法调用返回它. 每个型号都提供了独特的内置能力,准确知道你正在处理哪款iPhone有助于确定那个单元是否有可能支持诸如可访问性,GPS和磁力计之类的特性. #pragma mark sysctlbyname utils - (NSStri

GetAdaptersInof获取本地连接的网卡信息,排除无线网卡和虚拟网卡

/* 只获取本地连接的网卡信息,并不获取无线网卡和虚拟网卡的信息,要想获取无线网卡的信息,需把if(strstr(pAdapter->Description,"PCI")>0 && pAdapter- >Type==MIB_IF_TYPE_ETHERNET)改成if(strstr(pAdapter->Type==71),若要获取虚拟网卡的信息,需把if(strstr(pAdapter->Description,"PCI"

ioctl获取网络接口信息

linux下网络程序经常在启动执行后使用ioctl获取主机的全部网络接口信息, 例如接口地址.是否支持广播,是否支持多播等. 函数原型 #include <sys/ioctl.h> int ioctl(int d, int request, ...); 返回值:成功返回0,出错返回-1 常见选项 SIOCGIFCONF 获取所有接口的列表 SIOCGIFBRDADDR 获取广播地址 SIOCGIFMTU  获取mtu linux下使用ioctl操作网络接口,需要用到两个结构体 ifconf用来

Android USB API获取设备信息失败问题

在华为荣耀的盒子验证openni的程序,发现orbbec的3d摄像头一直无法使用,一直卡在 设备找不到的提示. 开始从下面2个方面验证:1.验证openni的本身自带的SimpleRead程序,看看是否正常读取到设备信息和depth 图.2.验证Android层usb权限控制问题. 经过验证发现openni自带的c++的可执行程序,可以正常读取到设备信息和depth 图.由此推测 orbbec 3d的驱动和openni的这块部分没有什么问题.问题可能出在Android层的usb权限和获取设备信息

Linux下编程获取本地IP地址的常见方法

转载于:http://blog.csdn.net/k346k346/article/details/48231933 在进行linux网络编程时,经常用到本机IP地址.本文罗列一下常见方法,以备不时之需. 获取本机IP地址,是一个相当灵活的操作,原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的.比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡.用户计算机所在网络拓扑结构未知,主机名设置是一个可选项,并且同样可以为一

LINUX - 获取本地ip

Linux编程获取本机IP地址的几种方法 参考:https://blog.csdn.net/zhongmushu/article/details/89944990 在进行Linux网络编程时,经常会需要获取本机IP地址,除了常规的读取配置文件外,本文罗列几种个人所知的编程常用方法,仅供参考,如有错误请指出. 方法一:使用ioctl()获取本地IP地址 Linux下可以使用ioctl()函数以及结构体 struct ifreq和结构体struct ifconf来获取网络接口的各种信息.具体过程是先

IOS 更多的设备信息

●  如果想获得更多的设备信息,比如 ●  设备型号.CPU情况.内存使用情况.硬盘使用情况 ●  是否越狱.装了哪些传感器.当前运行的进程 ●  ... ... ●  有2种方法获取更多的设备信息 ●  导入底层的C语言库,通过底层的C语言函数获取(较复杂,需要很多时间去研究) ● 使用第三方库(用OC封装了底层的C函数) https://github.com/Shmoopi/iOS-System-Services https://github.com/erica/uidevice-exten

一句话脚本系列之获取eth0网卡的IP地址(或MAC地址)

欢迎转载!转载时请注明出处:http://blog.csdn.net/nfer_zhuang/article/details/42609733 引言 使用场景: 我使用的Linux服务器上有多个网卡,有时候就需要在脚本中使用到指定网卡的IP地址或MAC地址,那么这个时候就有两种做法,一是预先读取网卡的IP地址或MAC地址,然后写入到脚本中:另外一种方法就是通过shell命令实时获取指定网卡上的当前IP地址或MAC地址. 一般用法: 使用ifconfig eth0读取网卡信息 手动将IP地址或MA