您的位置:首页 > 其它

用ioctl获得本地ip地址

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

首先先认识一下ifconf和ifreq:

//ifconf通常是用来保存所有接口信息的

//if.h

structifconf

{

intifc_len;/*sizeofbuffer*/

union

{

char*ifcu_buf;/*inputfromuser->kernel*/

structifreq*ifcu_req;/*returnfromkernel->user*/

}ifc_ifcu;

};

#defineifc_bufifc_ifcu.ifcu_buf/*bufferaddress*/

#defineifc_reqifc_ifcu.ifcu_req/*arrayofstructures*/


//ifreq用来保存某个接口的信息

//if.h

structifreq{

charifr_name[IFNAMSIZ];

union{

structsockaddrifru_addr;

structsockaddrifru_dstaddr;

structsockaddrifru_broadaddr;

shortifru_flags;

intifru_metric;

caddr_tifru_data;

}ifr_ifru;

};

#defineifr_addrifr_ifru.ifru_addr

#defineifr_dstaddrifr_ifru.ifru_dstaddr

#defineifr_broadaddrifr_ifru.ifru_broadaddr


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

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

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

.png]


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

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

   

.png]


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

下面有一个简单的参考:

#include

#include

#include

#include

#includein.h>

#include<string.h>

#includeif.h>

#include


intmain()

{

inti=0;

intsockfd;

structifconfifconf;

unsignedcharbuf[512];

structifreq*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=(structifreq*)buf;

for(i=(ifconf.ifc_len/sizeof(structifreq));i>0;i--)

{

//if(ifreq->ifr_flags==AF_INET){//foripv4

printf("name=[%s]/n",ifreq->ifr_name);

printf("localaddr=[%s]/n",

inet_ntoa(((structsockaddr_in*)&(ifreq->ifr_addr))->sin_addr));

ifreq++;

//}

}

return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: