首页 > 代码库 > 在NetBSD-1.0上使用ioctl获取接口配置清单的例子
在NetBSD-1.0上使用ioctl获取接口配置清单的例子
《TVP/IP v2》的4.4节介绍了 ioctl 系统调用,所以想验证下实际调用的结果,代码例子如下:
1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <net/if.h> 4 #include <net/if_dl.h> 5 #include <netinet/in.h> 6 #include <arpa/inet.h> 7 #include <sys/ioctl.h> 8 #include <stdlib.h> 9 10 int printaddr( const struct sockaddr *sa )11 {12 if( sa->sa_family == AF_LINK ) {13 struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa;14 int len = sdl->sdl_alen - 1, i;15 16 printf("\tAF_LINK\t");17 for( i = 0; i < len; i++ ) {18 printf("%02X:", (unsigned char)(sdl->sdl_data)[ sdl->sdl_nlen + i] );19 }20 printf( "%02X", (sdl->sdl_data)[ sdl->sdl_nlen + i] );21 }22 else if( sa->sa_family == AF_INET ) {23 struct sockaddr_in *sin = (struct sockaddr_in *)sa;24 printf("\tAF_INET\t");25 printf("%s:%d", inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));26 }27 }28 29 int main(void)30 {31 struct ifconf ifc;32 char buffer[200];33 int len;34 struct ifreq *ifrp;35 36 len = socket(AF_INET, SOCK_STREAM, 0);37 38 ifc.ifc_len = sizeof( buffer );39 ifc.ifc_buf = buffer;40 if( ioctl(len, SIOCGIFCONF, &ifc) < 0 )41 {42 perror("ioctl error");43 return -1;44 }45 46 len = ifc.ifc_len;47 ifrp = ifc.ifc_req;48 for(; len > 0 && ifrp; ) {49 struct sockaddr *sa = &(ifrp->ifr_addr);50 printf("%s", ifrp->ifr_name);51 printaddr( sa );52 printf("\n");53 54 ifrp = (struct ifreq *)((char *)sa + sa->sa_len);55 len -= sizeof(ifrp->ifr_name) + sa->sa_len;56 }57 58 return 0;59 }
在 NetBSD-1.0 上编译运行的结果为:
在NetBSD-1.0上使用ioctl获取接口配置清单的例子
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。