忙里偷闲,学一学《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
的思路,避免代码与协议相关。