简体   繁体   中英

How to get peer IP address in iOS app (iOS - non-iOS device peer-to-peer)

I am peering my iOS device with a non-iOS Direct-WiFi enabled device. In my iOS application, I like to initiate the connection with the remote server (ie the non-iOS device's server). To do this, first I need to bind my read and write streams to the host IP and port as follows:

NSInputStream *inputStream;
NSOutputStream *outputStream;

CFReadStreamRef rdStream;
CFWriteStreamRef wrStream;
NSString *ipAddr = ???    /* not know at design time */
UInt32 portNum = 4210;    /* specified at design time */

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)ipAddr, portNum, &rdStream, &wrStream);

inputStream = (__bridge NSInputStream *)rdStream;
outputStream = (__bridge NSOutputStream *)wrStream;

... then for each stream, I set the delegate, schedule in run loop, and open. Now they are ready for use. And obviously, in my iOS device, I go to the Settings built-in app and select the WiFi of the server I am peering with so my iOS device and the other device will be on the same network.

My problem is the server IP address is not known at my app design time, so I want to figure out this IP programmatically at runtime in my app. Is it possible? If so, please give me an idea.

Thanks

This will get you an array of IP's. For my purposes the second element was the iP of the host name:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#import <CFNetwork/CFNetwork.h>
#import <netinet/in.h>
#import <netdb.h>
#import <ifaddrs.h>
#import <arpa/inet.h>
#import <net/ethernet.h>
#import <net/if_dl.h>

...

    const char* hostnameC = [yourHostName UTF8String];

struct addrinfo hints, *res;
struct sockaddr_in *s4;
struct sockaddr_in6 *s6;
int retval;
char buf[64];
NSMutableArray *result; //the array which will be return
NSMutableArray *result4; //the array of IPv4, to order them at the end
NSString *previousIP = nil;

memset (&hints, 0, sizeof (struct addrinfo));
hints.ai_family = PF_UNSPEC;//AF_INET6;
hints.ai_flags = AI_CANONNAME;
//AI_ADDRCONFIG, AI_ALL, AI_CANONNAME,  AI_NUMERICHOST
//AI_NUMERICSERV, AI_PASSIVE, OR AI_V4MAPPED

retval = getaddrinfo(hostnameC, NULL, &hints, &res);
if (retval == 0)
{

    if (res->ai_canonname)
    {
        result = [NSMutableArray arrayWithObject:[NSString stringWithUTF8String:res->ai_canonname]];
    }
    else
    {
        //it means the DNS didn't know this host
        return;
    }
    result4= [NSMutableArray array];
    while (res) {
        switch (res->ai_family){
            case AF_INET6:
                s6 = (struct sockaddr_in6 *)res->ai_addr;
                if(inet_ntop(res->ai_family, (void *)&(s6->sin6_addr), buf, sizeof(buf))
                   == NULL)
                {
                    NSLog(@"inet_ntop failed for v6!\n");
                }
                else
                {
                    //surprisingly every address is in double, let's add this test
                    if (![previousIP isEqualToString:[NSString stringWithUTF8String:buf]]) {
                        [result addObject:[NSString stringWithUTF8String:buf]];
                    }
                }
                break;

            case AF_INET:
                s4 = (struct sockaddr_in *)res->ai_addr;
                if(inet_ntop(res->ai_family, (void *)&(s4->sin_addr), buf, sizeof(buf))
                   == NULL)
                {
                    NSLog(@"inet_ntop failed for v4!\n");
                }
                else
                {
                    //surprisingly every address is in double, let's add this test
                    if (![previousIP isEqualToString:[NSString stringWithUTF8String:buf]]) {
                        [result4 addObject:[NSString stringWithUTF8String:buf]];
                    }
                }
                break;
            default:
                NSLog(@"Neither IPv4 nor IPv6!");

        }
        //surprisingly every address is in double, let's add this test
        previousIP = [NSString stringWithUTF8String:buf];

        res = res->ai_next;
    }
}else{
    NSLog(@"no IP found");
    return;
}

...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM