1

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;
}

誰かが私に何が悪いのか教えてもらえますか?

4

1 に答える 1

0

これは、DNS ルックアップの失敗のようです。エラー メッセージの重要な部分は次のとおりです。

{kCFGetAddrInfoFailureKey=8}

CFNetwork エラー コード リファレンスからkCFGetAddrInfoFailureKey:

タイプのエラーが返された場合、このキーは、DNS ルックアップへの応答としてkCFHostErrorUnknownによって返された最後のエラー コードを返します。getaddrinfo結果を解釈するには、 でエラー コードを調べます/usr/include/netdb.h

から/usr/include/netdb.h:

#define EAI_NONAME  8  /* hostname nor servname provided, or not known */

別の DNS サーバーを使用してみてください。

于 2013-10-16T16:19:41.940 に答える