Obtaining a server IP address from hostname

后端 未结 3 1301
广开言路
广开言路 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 <arpa/inet.h>
    
    - (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"]
    
    0 讨论(0)
  • 2021-01-01 04:55

    You can use the system call gethostbyname() to resolve a hostname then use the returning structure to get the ip address. Have a look at inet_ntop() for this last part.

    EXAMPLE CODE

    struct hostent *hostentry;
    hostentry = gethostbyname("google.com");
    char * ipbuf;
    ipbuf = inet_ntoa(*((struct in_addr *)hostentry->h_addr_list[0]));
    printf("%s",ipbuf);
    
    0 讨论(0)
  • 2021-01-01 04:58

    I was asking a question regarding

    "how to get IP from hostname in unix\linux?"

    but found this question in a different context which is not for Unix I guess, let me correct if I am wrong

    since this question already been asked so I am fearing to avoid asking the same question marked as duplicated by stack overflow team.

    Quest: how to get IP from hostname in unix\linux?

    Ans: the two commands over there

    1. ping host_name

    Ex:

    ping -s google.co.in
    PING google.co.in: 56 data bytes
    64 bytes from dfw06s48-in-f3.1e100.net (216.58.194.99): icmp_seq=0. time=2.477 ms
    64 bytes from dfw06s48-in-f3.1e100.net (216.58.194.99): icmp_seq=1. time=1.415 ms
    64 bytes from dfw06s48-in-f3.1e100.net (216.58.194.99): icmp_seq=2. time=1.712 ms
    
    1. nslookup host_name

    Ex:

    nslookup google.co.in
    Server:         155.179.59.249
    Address:        155.179.59.249#53
    
    Non-authoritative answer:
    Name:   google.co.in
    Address: 216.58.194.99
    
    0 讨论(0)
提交回复
热议问题