我找到了从IP地址获取主机名的这段代码。问题是它总是在模拟器和我的3GS上失败。
请参见下面的代码,错误在以下代码中注释:
+ (NSArray *)hostnamesForAddress:(NSString *)address {
// Get the host reference for the given address.
CFStreamError streamError;
struct addrinfo hints;
struct addrinfo *result = NULL;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result);
if (errorStatus != 0) return nil;
CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen);
if (addressRef == nil) return nil;
freeaddrinfo(result);
CFHostRef hostRef = CFHostCreateWithAddress(kCFAllocatorDefault, addressRef);
if (hostRef == nil) return nil;
CFRelease(addressRef);
BOOL isSuccess = CFHostStartInfoResolution(hostRef, kCFHostNames, &streamError);
// always false
if (!isSuccess){
NSLog(@"error:%@",[self convertCFStreamErrorIntoNSError:streamError]);
// error:Error Domain=kCFErrorDomainCFNetwork Code=2 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)" UserInfo=0x1cd29190 {kCFGetAddrInfoFailureKey=8}
return nil;
}
// Get the hostnames for the host reference.
CFArrayRef hostnamesRef = CFHostGetNames(hostRef, NULL);
NSMutableArray *hostnames = [NSMutableArray array];
for (int currentIndex = 0; currentIndex < [(__bridge NSArray *)hostnamesRef count]; currentIndex++) {
[hostnames addObject:[(__bridge NSArray *)hostnamesRef objectAtIndex:currentIndex]];
}
return hostnames;
}有人能告诉我怎么了吗?
发布于 2013-10-16 16:19:41
这听起来像是DNS查找失败。错误消息的关键部分是:
{kCFGetAddrInfoFailureKey=8}来自CFNetwork误码参考 for kCFGetAddrInfoFailureKey
如果返回
kCFHostErrorUnknown类型的错误,则此键返回getaddrinfo响应DNS查找返回的最后一个错误代码。要解释结果,请在/usr/include/netdb.h中查找错误代码。
来自/usr/include/netdb.h
#define EAI_NONAME 8 /* hostname nor servname provided, or not known */尝试使用不同的DNS服务器。
https://stackoverflow.com/questions/19407309
复制相似问题