Obtaining a server IP address from hostname

后端 未结 3 1325
广开言路
广开言路 2021-01-01 04:01

When performing an NSURLRequest to a hostname, is it possible to obtain the IP address of the server that the response came from?

The NSURL

3条回答
  •  刺人心
    刺人心 (楼主)
    2021-01-01 04:41

    #import 
    
    - (BOOL)resolveHost:(NSString *)hostname {
        Boolean result;
        CFHostRef hostRef;
        CFArrayRef addresses;
        NSString *ipAddress = nil;
        hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge 
        CFStringRef)hostname);
        CFStreamError *error = NULL;
        if (hostRef) {
            result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, error); 
            if (result) {
                addresses = CFHostGetAddressing(hostRef, &result);
            }
        }
        if (result) {
            CFIndex index = 0;
            CFDataRef ref = (CFDataRef) CFArrayGetValueAtIndex(addresses, index);
    
            int port=0;
            struct sockaddr *addressGeneric;
    
            NSData *myData = (__bridge NSData *)ref;
            addressGeneric = (struct sockaddr *)[myData bytes];
    
            switch (addressGeneric->sa_family) {
                case AF_INET: {
                    struct sockaddr_in *ip4;
                    char dest[INET_ADDRSTRLEN];
                    ip4 = (struct sockaddr_in *)[myData bytes];
                    port = ntohs(ip4->sin_port);
                    ipAddress = [NSString stringWithFormat:@"%s", inet_ntop(AF_INET, &ip4->sin_addr, dest, sizeof dest)];
            }
                break;
    
            case AF_INET6: {
                struct sockaddr_in6 *ip6;
                char dest[INET6_ADDRSTRLEN];
                ip6 = (struct sockaddr_in6 *)[myData bytes];
                port = ntohs(ip6->sin6_port);
                ipAddress = [NSString stringWithFormat:@"%s", inet_ntop(AF_INET6, &ip6->sin6_addr, dest, sizeof dest)];
            }
                break;
            default:
                ipAddress = nil;
                break;
            }
        }
        NSLog(@"%@", ipAddress);
        if (ipAddress) {
            return YES;
        } else {
            return NO;
        }
    }
    
    [self resolveHost:@"google.com"]
    

提交回复
热议问题