- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ioctl和structifreq
用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_len和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)); i0; 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;
}
您可能关注的文档
- 国际营销教案1.doc
- 团委幻灯片(用于年底汇报).ppt
- 国际音标卡片.doc
- 国际金融调节内外均衡.ppt
- 图书评价论文.doc
- 图片转化文档的方法.doc
- 圆柱与圆锥练习(二).doc
- 圆的面积说课稿1.doc
- 土地开发居间合同文本2.doc
- 土地评估所业务讲义.doc
- 抢分秘籍10 带电粒子电场中的直线运动、偏转和交变电电场中的应用(三大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍11 带电粒子在组合场、叠加场中的运动(五大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍11 带电粒子在组合场、叠加场中的运动(五大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍12 电磁感应中的电路与图像问题(二大题型)(解析版) -2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍12 电磁感应中的电路与图像问题(二大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍14 热力学定律与气体实验定律综合应用(五大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍13 电磁感应中的动力学、能量和动量问题(三大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍14 热力学定律与气体实验定律综合应用(五大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍16 振动图像与波动图像的综合应用(三大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍15 光的折射、全反射的综合应用(二大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
文档评论(0)