《Linux网络接口》---------struct ifreq struct ifconf

网络接口--------------struct ifconfstruct ifreq

 

网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示:

接口

SIOCGIFCONF

SIOCSIFADDR

SIOCGIFADDR

SIOCSIFBRDADDR

SIOCGIFBRDADDR

SIOCSIFNETMASK

SIOCGIFNETMASK


获取所有接口列表

设置接口地址

获取接口地址

设置广播地址

获取广播地址

设置子网掩码

获取子网掩码


Struct  ifconf

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq


Ifreq结构用来配置ip地址,激活接口,配置MTU。在Linux系统中获取IP地址通常都是通过ifconfig命令来实现的,然而ifconfig命令实际是通过ioctl接口与内核通信,ifconfig命令首先打开一个socket,然后调用ioctlrequest传递到内核,从而获取request请求数据。处理网络接口的许多程序沿用的初始步骤之一就是从内核获取配置在系统中的所有接口。

Struct     ifreq     data;

Fd = socket(AF_NET,SOCK_DGRAM,0);

<      request       >

Ioctl(fd,SIOCGIFADDR,&data);

 struct ifconf结构体


struct ifconf{

lint ifc_len;

union{

    caddr_t  ifcu_buf

    Struct   ifreq *ifcu_req;

}ifc_ifcu

}

 

#define    ifc_buf    ifc_ifcu.ifcu_buf

#define    ifc_req    ifc_ifcu.ifcu_req

Struct ifreq接口

Struct ifreq{

Char ifr_name[IFNAMSIZ];

Union{

    Struct  sockaddr  ifru_addr;

    Struct  sockaddr  ifru_dstaddr;

    Struct  sockaddr  ifru_broadaddr;

    Struct  sockaddr  ifru_netmask;

    Struct  sockaddr  ifru_hwaddr;

    Short  ifru_flags;

    Int     ifru_metric;

    Caddr_t ifru_data;

}ifr_ifru;

};

#define ifr_addr        ifr_ifru.ifru_addr

#define ifr_broadaddr   ifr_ifru.ifru_broadadd

#define ifr_hwaddr      ifr_ifru_hwaddr



对于
ifconfifc_buf,其实就是Nifc_req,从上面的结构体中可以看出来,通过下面两幅图可以更加明显。 


接下来通过代码实现ifconfig功能,即可以查看本地的IPMAC地址、子网掩码等,首先通过ifconfig我们可以查看本机的信息,如下所示:


 

接下来通过代码实现如下所示

[cpp] view plaincopy
  1. #include<stdlib.h>  
  2. #include<stdio.h>  
  3. #include<unistd.h>  
  4. #include<net/if.h>  
  5. #include<net/if_arp.h>  
  6. #include<arpa/inet.h>  
  7. #include<sys/ioctl.h>  
  8. #include<errno.h>  
  9.    
  10. #define ETH_NAME  "eth0"  
  11.    
  12. static void get_local_ip(int sock_fd);  
  13. static void get_netmask_addr(int sock_fd);  
  14. static void get_mac_addr(int sock_fd);  
  15. static void get_broad_addr(int sock_fd);  
  16. struct sockaddr_in  sin;  
  17. struct sockaddr_in  netmask;  
  18. struct sockaddr_in  broad;  
  19. struct ifreq ifr;  
  20. unsigned char arp[6];  
  21. int main()  
  22. {  
  23. int sockfd;  
  24. //create socket  
  25. sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  26. if(sockfd == -1)  
  27. {  
  28. perror("socket");  
  29. return -1;  
  30. }  
  31. get_local_ip(sockfd);  
  32. get_mac_addr(sockfd);  
  33. get_netmask_addr(sockfd);  
  34. get_broad_addr(sockfd);  
  35. return 0;  
  36. }  
  37. static void get_local_ip(int sock_fd)  
  38. {  
  39. strncpy(ifr.ifr_name,ETH_NAME,IFNAMSIZ);  
  40. ifr.ifr_name[IFNAMSIZ - 1] = 0;  
  41. if(ioctl(sock_fd,SIOCGIFADDR,&ifr) == 0)  
  42. {  
  43. memcpy(&sin,&ifr.ifr_addr,sizeof(sin));  
  44. fprintf(stdout,"eth0: %s\n",inet_ntoa(sin.sin_addr));  
  45. }  
  46. }  
  47. static void get_mac_addr(int sock_fd)  
  48. {  
  49. if(ioctl(sock_fd,SIOCGIFHWADDR,&ifr)==0)  
  50. {  
  51. memcpy(arp,ifr.ifr_hwaddr.sa_data,6);  
  52. printf("adapter hardware address %x:%x:%x:%x:%x:%x\n",arp[0],arp[1],arp[2],arp[3],arp[4],arp[5]);  
  53. }  
  54. }  
  55. static void get_netmask_addr(int sock_fd)  
  56. {  
  57. if(ioctl(sock_fd,SIOCGIFNETMASK,&ifr)==0)  
  58. {  
  59. memcpy(&netmask,&ifr.ifr_netmask,sizeof(netmask));  
  60. printf("netmask: %s\n",inet_ntoa(netmask.sin_addr));  
  61. }  
  62. }  
  63. static void get_broad_addr(int sock_fd)  
  64. {  
  65. if(ioctl(sock_fd,SIOCGIFBRDADDR,&ifr)==0)  
  66. {  
  67. memcpy(&broad,&ifr.ifr_broadaddr,sizeof(broad));  
  68. printf("broad: %s\n",inet_ntoa(broad.sin_addr));  
  69. }  
  70. }  

所要查看的网卡名字为eth0;

然后创建一个SOCKET通信

static void get_local_ip(int sock_fd)函数用来获取本机IP地址,请求(request)SIOCGIFADDR

static void get_mac_addr(int sock_fd)获取本机的MAC地址,request SIOCGIFHWADDR

static void get_netmask_addr(int sock_fd)获取子网掩码地址,requestSIOCGIFNETMASK

static void get_broad_addr(int sock_fd)获取广播地址,requestSIOCGIFBRDADDR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议季Mic Drop:您不应该错过的13场Java演讲

您的老板没有派您参加真正的会议吗&#xff1f; 我们为您准备了最好的讲座 9月主要发生在一些重大事件上&#xff1a;秋季的第一天&#xff0c;甚至全国熏肉日。 这也是召开会议最忙的月份之一&#xff0c;一些大型Java事件涵盖了平台的新的重要更新。 在下面的帖子中&#x…

linux7设备的挂载,centos7磁盘分区与挂载解析

Linux系统在磁盘、U盘以及光盘等设备分区和挂载操做才能使用。centos1、磁盘分区原理与规则ui磁盘分区类型&#xff1a;主分区&#xff0c;扩展分区&#xff0c;逻辑分区this分区规则&#xff1a;centos7一、主分区扩展分区的数量不能超过4个&#xff0c;且扩展分区只能有1个。…

【公众号系列】SAP的新零售

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【公众号系列】SAP的新零售写在前面 还是以前的一篇文章&#xff08;一八年三月&#xff09;&#xff0c;拿出来重新了解一下。 随着…

linux下汇编语言开发总结

汇编语言是直接对应系统指令集的低级语言&#xff0c;在语言越来越抽象的今天&#xff0c;汇编语言并不像高级语言那样使用广泛&#xff0c;仅仅在驱动程序&#xff0c;嵌入式系统等对性能要求苛刻的领域才能见到它们的身影。但是这并不表示汇编语言就已经没有用武之地了&#…

使用openocd调试Linux内核,openocd安装与调试

环境&#xff1a;硬件&#xff1a;PC机ARM仿真器v8.00已下载好bit流的Xinlinx SoC开发板(其上有arm cortex-a9核)软件&#xff1a;Redhat Linux6(或虚拟机) openocd使用openocd下载程序&#xff0c;调试arm cortex-a9核。一、openocd安装下载libusb库安装或直接yum install li…

execl中设置的格式无法实现

在一次项目中&#xff0c;需要导出execl表&#xff0c;并且要给表中的表格设置格式&#xff0c;因为每列的格式都不一样&#xff0c;需要单独设置设置这些格式&#xff0c;在后期使用中因为导入的数据过多&#xff0c;是的后面的单元格中设置的格式无法实现。 每次打开execl表格…

loadrunner监控linux性能指标,使用LoadRunner监控Linux系统性能.doc

使用LoadRunner监控Linux系统性能性能监控案例■秘密 □机密 □绝密PAGELinux系统性能监控案例(仅供内部使用)版 本 号&#xff1a;V0.1保 密 等 级&#xff1a;■秘密 □机密 □绝密编 制&#xff1a;XXX审 核&#xff1a;修订记录日期版本号描述作者2011-06-130.1初稿完成目录…

github gists_Eclipse中的Github Gists

github gists我想描述有关在Eclipse中集成GitHub Gists的简单步骤。 有几个来源促使我这样做&#xff1a; Eclipse的GitHub Mylyn连接器 EGit / GitHub /用户指南 http://eclipse.github.com 我一直在使用Eclipse Java EE发行版&#xff0c;其中已经安装了Mylyn插件&#…

分析.cpp文件编译生成的汇编文件里语句的作用

1234int main(int argc,char** argv){return 1;}1g -S test.cpp生成test.s汇编文件 .file"null-test.cpp".text.globl main.type main, functionmain:.LFB0:.cfi_startproc pushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa…

vue-cli3.0使用及配置(部分)

好长一段时间没有关注vue脚手架了&#xff0c;昨天因为需要个后台模板&#xff0c;用脚手架 搞了一下&#xff0c;竟然发现指令不能用了&#xff0c;看官方文档已经升级3.0&#xff0c;也是试的玩了一下&#xff0c; 大致写写怎么玩的&#xff01;12341.先全局安装vue-cli3.0 …

centos arm-linux-gcc,CentOS 6.4配置arm-linux-gcc交叉环境

首先解压arm-linux-gcc到制定文件夹[armacer ~]$ sudo tar xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt/tool/配置环境变量&#xff1a;[armacer ~]$ sudo vi /etc/profile添加:PATH/opt/tool/gcc-3.4.5-glibc-2.3.6/bin:$PATHexport PATH保存退出。执行[armacer ~]$…

使用JavaSymbolSolver解决Java代码中的方法调用

为什么创建java-symbol-solver&#xff1f; 几年前&#xff0c;我开始使用JavaParser &#xff0c;然后开始做出贡献。 不久之后&#xff0c;我意识到我们想对Java代码执行的许多操作不能仅通过使用解析器生成的抽象语法树来完成&#xff0c;我们还需要解析类型&#xff0c;符号…

kali2.0安装搜狗输入法

其实方法应该是是通用的 &#xff08;一开始源要配置好&#xff1a; 修改软件源APT-sources.list [python] view plaincopy vim /etc/apt/sources.list 将原来的注释掉&#xff0c;加了个阿里的#阿里云kali源deb http://mirrors.aliyun.com/kali sana main non-free contrib…

linux+vim+动不了,linux的vim按了ctrl+s之后假死的解决办法

Aqua Data Studio中文乱码使用Aqua Data Studio 查询数据时,如果表中的数据有中文时,会显示乱码,如下图: 解决方法很简单,只能更改字体即可,步骤如下: 更改字体后,显示的结果如下:C&num;调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较1. 测试环境 1.1. 硬件环境…

aix linux操作系统,AIX--操作系统安装(AIX 6.1)

前一段时间&#xff0c;胡哥我接到老板的任务&#xff0c;要在AIX系统上安装zabbix agent呀。可是胡哥只是玩过linux对于AIX这种需要硬件支持的才能玩的高端玩意可是从来没接触过呀&#xff0c;虽说linux是类unix&#xff0c;可是与unix系统还是有区别。有啥办法了&#xff0c;…

秋季学习总结

经过这个学期的学习让我对软件工程这个专业有了新的认识&#xff0c;从c语言的学习中&#xff0c;让我慢慢懂得了如何去编写一个程序&#xff0c;但是编写一个程序也并不是那么的容易。在这个学期的学期中我总是感觉容易忘记上一节课所讲的东西&#xff0c;这个是课后自己没花时…

permgen_打破PermGen神话

permgen在我的最新文章中&#xff0c;我解释了可能导致java.lang.OutOfMemoryError&#xff1a;PermGen空间崩溃的原因 。 现在该讨论该问题的可能解决方案了。 或更确切地说&#xff0c;是关于互联网对可能解决方案的建议。 不幸的是&#xff0c;我只能说&#xff0c;当我通过…

到底是32位系统运行快还是64位系统快

首先声明一下&#xff0c;这个标题“到底是32位系统运行快还是64位系统运行快”的提法本身就是存在问题的&#xff0c;主要是由于很多网友把这个问题提炼的层次太高&#xff0c;那就是“我现在的机子是装32位系统快还是64位系统更快&#xff1f;”&#xff0c;所以就拿这个问题…

linux系统证书存储,Linux系统下如何配置Nginx的SSL安全证书

刚刚介绍了ownCloud的安装&#xff0c;有朋友问我SSL是怎么配置的&#xff0c;哎&#xff0c;为什么不去官方找&#xff0c;却来找我要呢&#xff0c;好吧&#xff0c;我知道你懒得看那些英文&#xff0c;我就介绍一下我是怎么一步步在Nginx上配置SSL的吧。首先你要确保你安装了…

命令界面:使用Java中的动态API处理Redis

Redis是一个数据存储&#xff0c;支持190多个已记录命令和450多个命令排列。 社区积极支持Redis开发&#xff1b; 每个主要的Redis版本都附带新命令。 今年&#xff0c;Redis向第三方供应商开放&#xff0c;以开发可扩展Redis功能的模块。 对于客户端开发人员和Redis用户而言&a…