


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、揭开 unix 网络之纱 8- ioctl 获得网络接口1 概述 需处理网络接口的许多程序沿用的初始步骤之一就是从内核获取配置在系统中的所有接 口。本任务由 SIOCGIFCONF 请求完成,它使用 ifconf 结构, ifconf 又使用 ifreq 结构。1.1 Ifconfig 结构<net/if.h>struct ifconfint ifc_len;unioncaddr_t ifcu_buf;struct ifreq* ifcu_req;ifc_ifcu;#define IFNAMSIZ 16Struct ifreqChar ifr_nameIFNAMSIZ;UnionS
2、truct sockaddr ifru_addr;Struct sockaddr ifru_dstaddr;Struct sockaddr ifru_broadaddr;Short ifru_flags;Int ifru_metric;Caddr_t ifru_data;ifr_ifru;2U#ifndef _UNP_IFI_H#define _UNP_IFI_H#include <net/if.h>#define IFI_NAME 16 /*same as IFNAMSIZ in <net/if.>*/ #define IFI_HADDR 8 /*allow for
3、64-bit EUI-64 in future*/ struct ifi_infochar ifi_nameIFI_NAME; /*interface name,null-terminated*/ short ifi_index;/*interface index*/short ifi_mtu;/*interface MTU*/u_char ifi_haddrIFI_HADDR; /*hardware address*/u_short ifi_hlen;short ifi_flags;short ifi_myflags;struct sockaddr *ifi_addr; struct soc
4、kaddr *ifi_brdaddr; struct sockaddr *ifi_dstaddr; struct ifi_info *ifi_next;/*#bytes in hardware address: 0,6,8*/ /*IFF_XXX constants from <net/if.h>*/ /*our own IFI_XXX flags*/*primary address*/*broadcast address*/*destination address*/*next of these structures*/ ;#define IFI_ALIAS 1 /*ifi_ad
5、dr is an alias*/ /*function prototypes*/struct ifi_info *get_ifi_info(int,int);void free_ifi_info(struct ifi_info *);#endif3 get_ifi_info#include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <errno.h> #include <netinet/in.h> #include <sys/ioctl.
6、h> #include <sys/un.h> #include <arpa/inet.h> #include <iostream> #include <string> #include <string.h> #include <net/if.h> #define max(a,b) using namespace std;/将地址转换为字符串,不在这里讨论char *sock_ntop_host(const struct sockaddr *sa, socklen_t salen) static char str128
7、;/* Unix domain is largest */ switch (sa->sa_family) case AF_INET:struct sockaddr_in *sin = (struct sockaddr_in *) sa;if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str) = NULL) return(NULL);return(str);#ifdef IPV6case AF_INET6:struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;if
8、(inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str) = NULL) return(NULL);return(str);#endif#ifdef AF_UNIX case AF_UNIX:struct sockaddr_un *unp = (struct sockaddr_un *) sa;/* OK to have no pathname bound to the socket: happens on* every connect() unless client calls bind() first. */ if (un
9、p->sun_path0 = 0) strcpy(str, "(no pathname bound)");else snprintf(str, sizeof(str), "%s", unp->sun_path); return(str);#endif#ifdef HAVE_SOCKADDR_DL_STRUCTcase AF_LINK:struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa;if (sdl->sdl_nlen > 0) snprintf(str, sizeof(str)
10、, "%*s", sdl->sdl_nlen, &sdl->sdl_data0);else snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index);return(str);#endifdefault:snprintf(str, sizeof(str), "sock_ntop_host: unknown AF_xxx: %d, len %d", sa->sa_family, salen);return(str);return (NUL
11、L);/关键struct ifi_info* get_ifi_info(int family,int doaliases)/struct ifi_info *ifi,*ifihead,*ifipnext;int sockfd,len,lastlen,flags,myflags,idx=0,hlen=0;char *ptr,*buf,lastnameIFNAMSIZ,*cptr,*haddr,*sdlname;/<net/if.h> 中定义struct ifconf ifc;struct ifreq *ifr,ifrcopy;/地址struct sockaddr_in *sinptr
12、;struct sockaddr_in6 *sin6ptr;/ 创立 socket 套接字,数据报sockfd = socket(AF_INET,SOCK_DGRAM,0); lastlen=0;len=100*sizeof(struct ifreq); /取出网络接口信息 for(;)/开辟 100 fireq 的空间 buf=(char*)malloc(len); ifc.ifc_len=len;ifc.ifc_buf=buf; if(ioctl(sockfd,SIOCGIFCONF,&ifc)<0)if(errno != EINV AL | lastlen != 0) co
13、ut<<"ioctl error"<<endl; exit(0); elseif(ifc.ifc_len = lastlen);break; lastlen=ifc.ifc_len;len+=10*(sizeof(struct ifreq); free(buf);ifihead=NULL; ifipnext=&ifihead;lastname0=0; sdlname=NULL;for(ptr=buf;ptr<buf+ifc.ifc_len;)ifr=(struct ifreq*)ptr;#ifdef HA VE_SOCKADDR_SA_
14、LENlen = max(sizeof(struct sockaddr),ifr->ifr_addr.sa_len);#elseswitch(ifr->ifr_addr.sa_family)#ifdef IPV6case AF_INET6: len=sizeof(struct sockaddr_in6); break;#endifcase AF_INET:default: len=sizeof(struct sockaddr); break;#endif ptr+=sizeof(ifr->ifr_name)+len;#ifdef HA VE_SOCKADDR_DL_STRUC
15、T if(ifr->ifr_addr.sa_family=AF_LINE)struct sockaddr_dl *sdl=(struct sockaddr_dl*)&ifr->ifr_addr; sdlname=ifr->ifr_name;idx=sdl->sdl_index; haddr=sdl->sdl_data + sdl->sdl_nlen; hlen=sdl->sdl_alen;#endifif(ifr->ifr_addr.sa_family != family) continue;myflags=0; if(cptr=strc
16、hr(ifr->ifr_name,':')!=NULL) *cptr=0;if(strncmp(lastname,ifr->ifr_name,IFNAMSIZ) =0)if(doaliases=0)continue;myflags=IFI_ALIAS;memcpy(lastname,ifr->ifr_name,IFNAMSIZ);ifrcopy = *ifr;ioctl(sockfd,SIOCGIFFLAGS,&ifrcopy);flags=ifrcopy.ifr_flags;if(flags & IFF_UP)=0)continue;ifi=
17、(ifi_info*)calloc(1,sizeof(struct ifi_info);*ifipnext=ifi;ifipnext=&ifi->ifi_next;ifi->ifi_flags=flags;ifi->ifi_myflags=myflags;#if defined(SIOCGIFMTU) && defined(HA VE_STRUCT_IFREQ_IFR_MTU) ioctl(sockfd,SIOCGIFMTU,&ifrcopy);ifi->ifi_mtu=ifrcopy.ifr_mtu;#elseifi->ifi_m
18、tu=0;#endifmemcpy(ifi->ifi_name,ifr->ifr_name,IFI_NAME);ifi->ifi_nameIFI_NAME-1='0'if(sdlname=NULL | strcmp(sdlname,ifr->ifr_name) != 0)idx=hlen=0;ifi->ifi_index=idx;ifi->ifi_hlen=hlen;if(ifi->ifi_hlen > IFI_HADDR)ifi->ifi_hlen=IFI_HADDR;if(hlen)memcpy(ifi->ifi_
19、haddr,haddr,ifi->ifi_hlen);switch(ifr->ifr_addr.sa_family)case AF_INET:sinptr=(struct sockaddr_in*)&ifr->ifr_addr;ifi->ifi_addr=(struct sockaddr*)calloc(1,sizeof(struct sockaddr_in); memcpy(ifi->ifi_addr,sinptr,sizeof(struct sockaddr_in);#ifdef SIOCGIFBRDADDRif(flags & IFF_BRO
20、ADCAST) ioctl(sockfd,SIOCGIFBRDADDR,&ifrcopy); sinptr=(struct sockaddr_in*)&ifrcopy.ifr_broadaddr; ifi->ifi_brdaddr=(struct sockaddr*)calloc(1,sizeof(structsockaddr_in);memcpy(ifi->ifi_brdaddr,sinptr,sizeof(struct sockaddr_in);#endif#ifdef SIOCGIFDSTADDRif(flags & IFF_POINTOPOINT)
21、ioctl(sockfd,SIOCGIFDSTADDR,&ifrcopy); sin6ptr=(struct sockaddr_in6*)&ifrcopy.ifr_dstaddr; ifi->ifi_dstaddr=(struct sockaddr*)calloc(1,sizeof(struct sockaddr_in6);memcpy(ifi->ifi_dstaddr,sin6ptr,sizeof(struct sockaddr_in6);#endifbreak;default:break;free(buf); return(ifihead);void free_
22、ifi_info(struct ifi_info *ifihead)struct ifi_info *ifi,*ifinext;for(ifi = ifihead;ifi != NULL;ifi=ifinext) if(ifi->ifi_addr != NULL) free(ifi->ifi_addr);if(ifi->ifi_dstaddr != NULL) free(ifi->ifi_brdaddr);if(ifi->ifi_dstaddr != NULL) free(ifi->ifi_dstaddr);ifinext=ifi->ifi_next;
23、free(ifi);int main(int argc,char* argv)struct ifi_info *ifi,*ifihead;struct sockaddr* sa; u_char *ptr;int i,family,doaliases;if(argc != 3)cout<<"usage: prifinfo <inet4 | inet6 > <doaliases>"<<endl; exit(0);if(strcmp(argv1,"inet4")=0)family=AF_INET;else if(
24、strcmp(argv1,"inet6")=0)family=AF_INET6;elsecout<<"invalid <address-family>"<<endl;exit(0);doaliases=atoi(argv2);for(ifihead = ifi = get_ifi_info(family,doaliases);ifi != NULL;ifi=ifi->ifi_next) printf("%s: ",ifi->ifi_name);if(ifi->ifi_index !
25、= 0)printf("(%d) ",ifi->ifi_index);printf("<");if(ifi->ifi_flags & IFF_UP) printf("UP ");if(ifi->ifi_flags & IFF_BROADCAST) printf("BCAST ");if(ifi->ifi_flags & IFF_MULTICAST) printf("MCAST ");if(ifi->ifi_flags & IFF
26、_LOOPBACK) printf("LOOP ");if(ifi->ifi_flags & IFF_POINTOPOINT) printf("P2P ");printf(">n");if(i=ifi->ifi_hlen) >0)ptr=ifi->ifi_haddr;doprintf("%s%x", (i = ifi->ifi_hlen) ? " ": ":",*ptr+);while(-i>0);printf("n");if(ifi->ifi_mtu != 0)printf(" MTU: %dn",ifi->ifi_mtu);if(sa = ifi->ifi_addr) != NULL)printf(" IP addr: %sn",sock_ntop_host(sa,sizeof(*sa);if(sa = ifi->ifi_brdaddr) != NULL)printf(" broadcast addr: %sn",sock_ntop_host(sa,sizeof(*sa); if(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- XX大学特聘教授聘任合同6篇
- 有关生产合同范本(一级)9篇
- 洗车场租赁合同
- 2025年二手车位买卖合同6篇
- 水暖维修合同
- 材料加工简单的合同
- 电梯托管合同协议书
- 生意项目合同协议书
- 区域性企业工会集体合同9篇
- 租凭土地合同协议书
- 2025年电工操作资格证考试复习考试题库(共583题)(含答案)
- 2025年摄影师职业技能鉴定试卷:摄影现场拍摄光线与色彩协调技巧试题
- 临床面试专业真题及答案
- 2025年公共事务管理师考试试卷及答案
- 医药职业道德课程课件
- 2025-2030中国铍行业市场发展趋势与前景展望战略研究报告
- 2025届河北省“五个一”名校联盟高三下学期4月联考物理试题(含答案)
- logo保密合同协议
- 网格员考试题及答案重庆
- 网络安全知识手册
- 消费者心理与行为附微课第2版白玉苓课后参考答案
评论
0/150
提交评论