《UNIX 网络编程》 第三章课后习题第三题
2017-08-31 08:43
441 查看
试写一个名为inet_pton_loose的函数,它能处理如下情形:如果地址族为AF_INET且inet_pton返回0,那就调用inet_aton看是否成功;类似地,如果地址族为AF_INET6且inet_pton返回0,那么就调用inet_aton看是否成功,若成功返回其IPv4映射的IPv6地址。
#include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> /** 具体的转换过程,不做详细注释,有更好的实现方式 **/ int inet_pton_loose(int family,const char *strptr,void *addrptr) { int i = 0; if(inet_pton(family,strptr,addrptr) == 0){ struct in_addr v4addr; if(inet_aton(strptr,&v4addr) == 1){ if(family == AF_INET){ memcpy(addrptr,(void *)&v4addr,sizeof(struct in_addr)); return 1; } if(family == AF_INET6){ struct in6_addr v6addr; for(i=0;i<16;i++){ if(i<10) v6addr.s6_addr[i] = 0; if(i >= 10 && i < 12) v6addr.s6_addr[i] = 0xf; if(i >= 12 ) v6addr.s6_addr[i] = htonl(v4addr.s_addr)>>(16-i-1)*8; } memcpy(addrptr,(void *)&v6addr,sizeof(struct in6_addr)); return 1; } } return 0; } return 1; } /** 获取输入,辨别是IPv4 还是IPv6 并做相应的处,理完成后输出用户的输入。没有添加错误处理。 **/ int main(int argc,char **argv) { struct in_addr IPv4addr; struct in6_addr IPv6addr; const u_char *strptr; const char *AddrFlag4 = "AF_INET"; const char *AddrFlag6 = "AF_INET6"; if(strcmp(AddrFlag4,argv[1]) == 0){ if(inet_pton_loose(AF_INET,argv[2],(void *)&IPv4addr) == 1){ strptr = (u_char *)&IPv4addr; printf("%s---%d.%d.%d.%d\n",argv[1],strptr[0],strptr[1],strptr[2],strptr[3]); return 1; } } if(strcmp(AddrFlag6,argv[1]) == 0){ if(inet_pton_loose(AF_INET6,argv[2],(void *)&IPv6addr) == 1){ strptr = (u_char *)&IPv6addr; printf("%s---%d%d:%d%d:%d%d:%d%d:%d%d:%x%x:%d.%d.%d.%d\n",argv[1],strptr[0],strptr[1], strptr[2],strptr[3],strptr[4],strptr[5],strptr[6],strptr[7],strptr[8],strptr[9] ,strptr[10],strptr[11],strptr[12],strptr[13],strptr[14],strptr[15]); return 1; } } return 1; }
#include "unp.h" in_addr_t inet_pton_loose(int family, const char *strptr,void *addrptr) { struct in_addr *ap = (struct in_addr *)addrptr; int result = 0; if((family == AF_INET) && (inet_pton(family,strptr,addrptr) == 0)) { printf("the net protocol is IPv4 str is %s\n",strptr); result = inet_aton(strptr,ap); printf("result is %d\n",result); if(result) return ap->s_addr; else return 0; } else if ((family == AF_INET6) && (inet_pton(family,strptr,addrptr) == 0)) { printf("the net protocol is IPv6\n"); result = inet_aton(strptr,ap); printf("result is %d\n",result); if(result) { return ap->s_addr; } else return 0; } return 0; } int main (int argc, char **argv) { //if argv[1] is zero, means AF_INET type, 1 for AF_INET6 type char s[20]; struct in_addr addr; in_addr_t addr_result = 0; if(argc < 2) { printf("usage: ./mytest <fa> <addr>\n"); return 1; } bzero(&addr,sizeof(struct in_addr)); memset(s,0,sizeof(s)); strcpy(s,argv[2]); if(atoi(argv[1]) == 0) { printf("the net protocol is IPv4\n"); addr_result = inet_pton_loose(AF_INET,s,(void *)&addr); printf("addr_result is %x\n",addr_result); } else if(atoi(argv[1]) == 1) { printf("the net protocol is IPv6\n"); addr_result = inet_pton_loose(AF_INET6,s,(void *)&addr); printf("addr_result is %x\n",addr_result); } return 0; }
相关文章推荐
- 《UNIX 网络编程》 第三章课后习题第三题
- 第三课_课后习题解答
- 数据结构与算法分析课后习题第三章(3)
- 搜索引擎和信息检索实践_课后习题_第三章
- Scala函数式编程课后习题答案(第三章)(更新ing)
- 《学习OpenCV》课后习题解答(第三章)(仅供参考)
- 鸟哥的linux私房菜基础学习篇课后习题与答案 第三章
- UNIX环境高级编程习题——第三章
- 《学习OpenCV》课后习题解答(第三章)(仅供参考)
- C++Primer Plus笔记——第三章 处理数据及课后习题答案
- 《统计建模与R软件》第三章课后习题3.1-3.4解题答案
- 《Python编程 从入门到实践》第三章课后习题
- 数据库原理 西安电子科技大学(第三版) 付婷婷 第三章 课后习题答案
- Java语言程序设计(基础篇)原书第十版 课后习题 第三章
- 《视觉SLAM》第三章课后习题
- 《C++ Primer》第五版课后习题解答_第三章(3)(21-29)
- C++面型对象程序 (电子工业出版社)设计课后习题第三章最后两题
- C++Primer 中文版 第五版 第三章课后习题答案
- c++primer第四版第三章课后习题的几个解答算法
- 第三章习题3-第三题=改写彩票例题