qiniu / happy-dns-objc

dns library for objective c
MIT License
505 stars 83 forks source link

ipv6的字符串长度可以去到39bytes,你们定义的previousIp只有32bytes,会导致inet_ntop得不到真正的ipv6 #22

Closed santa0000 closed 8 years ago

santa0000 commented 8 years ago

加上之前的freeaddrinfo崩溃,连续两个明显错误,不知道你们有没有在真正的ipv6环境下测试过的

dopcn commented 8 years ago

@santa0000 你好,我看了下源码,QNResolver 里

const char *p = inet_ntop(AF_INET, ns_rr_rdata(rr), buf, 32);
val = [NSString stringWithUTF8String:p];

应该是不管什么环境只请求 ipv4 地址,我用官方提供的测试方法用Mac建立NAT64 Wi-Fi下测得到的都是ipv4 地址,请问你是怎么测试的,可以得到 ipv6 地址 ?

santa0000 commented 8 years ago

ios9.2以上,得到的是v6地址,9.2以下得到的是v4

qn_localIp最后面几行的inet_ntop,是这样写的

if (family == AF_INET6) { addr = &((struct sockaddr_in6 )&localAddress)->sin6_addr; } else { addr = &((struct sockaddr_in )&localAddress)->sin_addr; } const char *ip = inet_ntop(family, addr, buf, buf_size);

你们的bufsize好像等于32,所以v6下,ip就等于空了,你看下

dopcn commented 8 years ago

@santa0000 我不是七牛这个库的维护者,是对这个库是否真的完全支持ipv6 有疑问,在请求localip 的方法里表面上看确实有判断ipv6 的情况。我贴的代码段是QNResolver 里的方法

- (NSArray *)query:(QNDomain *)domain networkInfo:(QNNetworkInfo *)netInfo error:(NSError *__autoreleasing *)error 

中的。因为写死 AF_INET 所以每次用 QNResolver 去请求IP 拿回来的都是 ipv4 地址,即使是在Mac的模拟nat64 环境中。

不知道是不是这回事?如果是的话感觉有点怪

并且这个方法名字就叫

static NSArray *query_ip_v4(res_state res, const char *host) 

但并没有对应的 v6 版本

longbai commented 8 years ago

@dopcn 这个本来是有v6版本,为了保持兼容性 后来就去掉了,因为返回真v6地址,上层库要做 适配IP为 http://[ipv6]:port/path 这样的处理,为了保持一致,在调用层来做。

longbai commented 8 years ago

fixed in #30