《Unix 网络编程》第三章习题
2021/4/11 1:25:42
本文主要是介绍《Unix 网络编程》第三章习题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
忙里偷闲,学一学《Unix 网络编程》哈哈哈哈哈。
第三章有这样一个练习:
试写一个名为inet_pton_loose的函数,它能处理如下情形:如果地址族为AF_INET且inet_pton返回0,那就调用inet_aton看是否成功;类似地,如果地址族为AF_INET6且inet_pton返回0,那么就调用inet_aton看是否成功,若成功返回其IPv4映射的IPv6地址。
写完之后查了一些答案,感觉都不是我想要的,所以把我的垃圾代码放在这里,期待哪个大佬路过指出问题!
#include <string.h> #include "unp.h" int inet_pton_loose(const char *sp, const struct sockaddr *sa) { if (sa->sa_family == AF_INET) { struct sockaddr_in *sin = (struct sockaddr_in *)sa; if (inet_pton(AF_INET, sp, &sin->sin_addr) == 0) { if (inet_aton(AF_INET, sp, &sin->sin_addr.in_addr) == 1) return (1); else return (0); } else { return (1); } } else if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; if (inet_pton(AF_INET6, sp, &sin6->sin6_addr) == 0) { if (inet_aton(AF_INET6, sp, &sin6->sin6_addr.in6_addr) == 1) { char newsp[INET6_ADDRSTRLEN]; bzero(newsp, sizeof(newsp)); // 7: sizeof("::FFFF:") bcopy(newsp, "::FFFF:", 7); strcat(newsp, sp); if (inet_pton(AF_INET6, newsp, &sin6->sin6_addr) == 1) return (1); else return (0); } else return (0); } else { return (1); } } return (0); }
主要参考了书中sock_ntop
的思路,避免代码与协议相关。
这篇关于《Unix 网络编程》第三章习题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现