0

iOS デバイスを非 iOS Direct-WiFi 対応デバイスとピアリングしています。私の iOS アプリケーションでは、リモート サーバー (つまり、iOS 以外のデバイスのサーバー) との接続を開始したいと考えています。これを行うには、まず次のように、読み取りストリームと書き込みストリームをホスト IP とポートにバインドする必要があります。

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;

...次に、ストリームごとに、デリゲートを設定し、実行ループでスケジュールして、開きます。これで、使用する準備が整いました。そして明らかに、私の iOS デバイスでは、組み込みアプリの設定に移動し、ピアリングしているサーバーの WiFi を選択して、私の iOS デバイスと他のデバイスが同じネットワーク上にあるようにします。

私の問題は、アプリの設計時にサーバーの IP アドレスがわからないことです。そのため、アプリで実行時にプログラムでこの IP を把握したいと考えています。出来ますか?もしそうなら、私にアイ​​デアをください。

ありがとう

4

1 に答える 1

1

これにより、一連のIPが取得されます。私の目的では、2番目の要素はホスト名のIPでした。

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

..。

于 2012-12-14T00:42:13.473 に答える