两个结构体ifconf和ifreq

用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人
来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助
理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考.

首先先认识一下ifconf和ifreq:

//ifconf通常是用来保存所有接口信息的
//if.h
struct ifconf 
{
    int    ifc_len;            /* size of buffer    */
    union 
    {
        char *ifcu_buf;                        /* input from user->kernel*/
        struct ifreq *ifcu_req;        /* return from kernel->user*/
    } ifc_ifcu;
};
#define    ifc_buf    ifc_ifcu.ifcu_buf        /* buffer address    */
#define    ifc_req    ifc_ifcu.ifcu_req        /* array of structures    */
 
//ifreq用来保存某个接口的信息
//if.h
struct ifreq {
    char ifr_name[IFNAMSIZ];
    union {
        struct sockaddr ifru_addr;
        struct sockaddr ifru_dstaddr;
        struct sockaddr ifru_broadaddr;
        short ifru_flags;
        int ifru_metric;
        caddr_t ifru_data;
    } ifr_ifru;
};
#define ifr_addr ifr_ifru.ifru_addr
#define ifr_dstaddr ifr_ifru.ifru_dstaddr
#define ifr_broadaddr ifr_ifru.ifru_broadaddr

 

上边这两个结构看起来比较复杂,我们现在把它们简单化一些:
比如说现在我们向实现获得本地IP的功能。

我们的做法是:
1. 先通过ioctl获得本地所有接口的信息,并保存在ifconf中
2. 再从ifconf中取出每一个ifreq中表示ip地址的信息

具体使用时我们可以认为ifconf就有两个成员:
ifc_len 和 ifc_buf,
如图一所示:   

 


ifc_len:表示用来存放所有接口信息的缓冲区长度
ifc_buf:表示存放接口信息的缓冲区

所以我们需要在程序开始时对ifconf的ifc_led和ifc_buf进行初始化
接下来使用ioctl获取所有接口信息,完成后ifc_len内存放实际获得的借口信息总长度
并且信息被存放在ifc_buf中。

接下来我们只需要从一个一个的接口信息获取ip地址信息即可。

下面有一个简单的参考:

#include 
#include 
#include 
#include 
#include in.h>
#include <string.h>
#include if.h>
#include 
 
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");
        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){            //for ipv4
          printf("name = [%s]\n", ifreq->ifr_name);
      printf("local addr = [%s]\n", 
                      inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
      ifreq++;
//  }
  }
    return 0;
}

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

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

相关文章

java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思

我有一个关于TCP套接字实现的connect()调用的问题.对于connect()调用来说,非阻塞是什么意思. connect()调用通过发送syn,等待SYNACK然后发送ACK,与其他一些套接字进行三次握手.如果连接成功,connect()调用也返回true,否则返回false.如果调用是非阻塞的,那么我猜这意味着连接应该…

php 换行 PHP_EOL变量

一个小小的换行&#xff0c;其实在不同的平台有着不同的实现&#xff0c;为什么要这样&#xff0c;可以是世界是多样的。 本来在unix世界换行就用/n来代替&#xff0c;但是windows为了体现他的不同&#xff0c;就用/r/n&#xff0c;更有意思的是在mac中用/r 因此unix系列用 /n …

alarm项目bug

1. rt5350上运行的soap服务器程序&#xff0c;响应时间过长 原因&#xff1a;打开了soap的调试日志&#xff0c;soap的调试日志是保存的文件中的。所以在rt5350上文件读写速度太慢造成的。因此 在编译的时候不能加-DDEBUG 2. 串口一次read调用读到两帧完整的报文测&#xff0c…

java 读取图片给 matlab_如何将MATLAB图像处理程序转换为java?

将Matlab代码转换为Java代码有几个一般的缺陷.我将Matlab转换成C代码,所以我的建议来自于这些经验.>如果你在Matlab中使用for循环,一般来说,你做错了.添加矩阵(图像等)是相当简单的&#xff1a;a b c;不管图像的大小.过滤也是一个相当简单的调用&#xff1a;a imfilter(‘…

C++ 一键关闭屏幕

Demo下载地址&#xff1a;http://pan.baidu.com/s/1vN4wF #include <windows.h> #include "resource.h"LRESULT CALLBACK WindowProc( HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterL…

django 学习 (一)

1. 下载Django 1.3.3 https://pypi.python.org/simple/django/ 2. 验证下载的文件 md5sum 3. 解压安装 python setup.py install 4. 在python的shell里验证是否安装成功 import django 5. 建立第一个django工程 django-admin.py startproject firstproject 6. 修改新建的工…

炸金花比牌规则java_陈陈来给你们炸金花的简易纸牌规则教学与心态指导

原标题&#xff1a;陈陈来给你们炸金花的简易纸牌规则教学与心态指导炸金花是在全国广泛流传的一种4-7人能同时进行的民间纸牌游戏。游戏使用一副扑克牌&#xff0c;去掉大小王&#xff0c;共52张牌&#xff0c;以手中的三张牌比输赢&#xff0c;游戏过程中需要考验玩家的胆略和…

EBS业务学习之应付INVOICE类型

INVOICE类型 类 型 描 述 标准INVOICE 是指由于采购货物或接受劳务&#xff0c;从供应商处取得的INVOICE &#xff08;标准INVOICE&#xff0c;既可以和订单匹配&#xff0c;也可以不匹配&#xff09; 贷项通知单 是指供应商对已开INVOICE的货物或劳务&…

django 学习 (二) 模板

1. 在应用的目录下创建templates目录&#xff0c;并创建一个html文件&#xff0c;比如my.html 2. 修改应用的views.py文件&#xff0c;将my.html文件反馈给请求&#xff0c;有以下几种写法 1) from django.template import loader, Context from django.http import HttpRespo…

简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序

Socket简要阐述Socket的概念Socket的英文原义是“孔”或“插座”。在网络编程中&#xff0c;网络上的两个程序通过一个双向的通信连接实现数据的交换&#xff0c;这个连接的一端称为一个Socket。Socket套接字是通信的基石&#xff0c;是支持TCP/IP协议的网络通信的基本操作单元…

华为基于策略划分VLAN的配置方法及示例

学过思科交换机的朋友&#xff0c;可能对基于策略划分VLAN的配置方法印象非常深&#xff0c;感觉确实比较复杂&#xff0c;先要配置VMPS以及VMPS数据库&#xff0c;但在华为交换机中&#xff0c;这种现象得到了彻底改变&#xff0c;因为它有了一种特殊的端口类型——Hybrid。说…

django 学习 (三) 模板变量

将views.py中的变量传递给html模板来显示&#xff0c;变量是以字典的形式传递给html模板文件显示的。 模板文件里以字典的{{健名}}来得到健值。 可传递的变量有以下几种形式 1. 基本变量 return render_to_response(index.html, {title:title-django, user:user-django}) 2. 字…

我的世界java刷怪数量_Minecraft我的世界Java版18w16a更新发布

Minecraft我的世界Java版18w16a更新发布&#xff01;Minecraft 1.13 仍未发布&#xff0c;18w16a为其第32个预览版。目前新版本已经基本完成了所有特性&#xff0c;现在更专注于漏洞修复和细节打磨了&#xff01;MINECRAFT SNAPSHOT 18W16AA Minecraft Java Edition snapshotJa…

IOS web app一些实用的属性设置

IOS对safari私有的属性很多&#xff0c;虽然很多不为人知但是却很实用。掌握好这些属性对web app和混合app的开发会很有帮助。 1.format-detection[telephoneno] 是否自动把电话号码转为链接 1<meta name"format-detection" content"telephoneno">IO…

django 学习 (四) 模板标签

模板标签实现html文件中的控制语句&#xff0c;模板标签语句用{% %}形式编写 假如在views.py文件中定义以下内容并传递给模板 my_dic {name:zhang, age:32, sex:male} my_list [aaa,bbb] return render_to_response(index.html, {list:my_list, dic:my_dic}) 下面为模板文…

java构建内存池队列_内存池完整实现代码及一些思考

为了提高效率和有效的监控内存的实时状态&#xff0c;我们采取了内存池的思想来解决效率与对内存实现监控的问题。网上查找到了一些方案&#xff0c;根据自己的理解实现了应用。我们什么时候要调用到内存池&#xff0c;1&#xff0c;当我们频繁的申请释放同样数据大小的内存空间…

Hibernate 第一个体验程序

首先要导入包&#xff0c;将下载的hibernate所有required包导入&#xff0c;将下载的hibernate用来写log的slf4j的api和nopjar包导入&#xff0c;将下载的mysql链接引擎jar包导入。 然后新建java工程。 先告诉hiernate怎么连数据库&#xff1a;在hibernate默认识别目录src根目录…

Django框架里的MVC思想

让我们来研究一个简单的例子&#xff0c;通过该实例&#xff0c;你可以分辨出&#xff0c;通过Web框架来实现的功能与之前的方式有何不同。 下面就是通过使用Django来完成以上功能的例子&#xff1a; 首先&#xff0c;我们分成4个Python的文件&#xff0c;(models.py , views.p…

小米功能机支持java吗_小米竟然卖功能机了!2.8吋/15天超长待机

【手机中国 新闻】众多周知&#xff0c;小米是从智能手机起家的&#xff0c;对于功能机从未涉足。但自从有了强大的小米生态链&#xff0c;制造各种科技产品那都不是事儿了。8月2日上午10点&#xff0c;小米有品众筹频道上线了一款功能手机——QIN多亲AI电话&#xff0c;仅售19…

Linux内核Crash分析

http://blog.chinaunix.net/uid-20788636-id-4377271.html 在工作中经常会遇到一些内核crash的情况&#xff0c;本文就是根据内核出现crash后的打印信息&#xff0c;对其进行了分析&#xff0c;使用的内核版本为&#xff1a;Linux2.6.32。 每一个进程的生命周期内&#xff0c…