Iphone 如何在iOS应用程序中获取对等IP地址(iOS-非iOS设备对等)

Iphone 如何在iOS应用程序中获取对等IP地址(iOS-非iOS设备对等),iphone,ios,wifi,p2p,Iphone,Ios,Wifi,P2p,我正在使用非iOS Direct WiFi设备查看iOS设备。在iOS应用程序中,我喜欢启动与远程服务器(即非iOS设备的服务器)的连接。为此,首先我需要将读写流绑定到主机IP和端口,如下所示: NSInputStream *inputStream; NSOutputStream *outputStream; CFReadStreamRef rdStream; CFWriteStreamRef wrStream; NSString *ipAddr = ??? /* not know at

我正在使用非iOS Direct WiFi设备查看iOS设备。在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。可能吗?如果是这样,请给我一个想法


谢谢

这将为您提供一系列IP。就我而言,第二个元素是主机名的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;
}
#包括
#包括
#包括
#进口
#进口
#进口
#进口
#进口
#进口
#进口
...
const char*hostnameC=[yourHostName UTF8String];
结构addrinfo提示,*res;
*s4中的结构sockaddr_;
6*s6中的结构sockaddr_;
内部检索;
char-buf[64];
NSMutableArray*结果//将返回的数组
NSMutableArray*result4//IPv4的数组,以便在末尾对其进行排序
NSString*previousIP=nil;
memset(&hints,0,sizeof(struct addrinfo));
hits.ai_family=PF_unsec//AF_INET6;
hits.ai_flags=ai_CANONNAME;
//AI_ADDRCONFIG、AI_ALL、AI_CANONNAME、AI_NUMERICHOST
//AI_NUMERICSERV、AI_PASSIVE或AI_V4;
retval=getaddrinfo(hostnameC、NULL、提示和res);
如果(retval==0)
{
如果(res->ai_canonname)
{
结果=[NSMutableArray arrayWithObject:[NSString stringWithUTF8String:res->ai_canonname]];
}
其他的
{
//这意味着DNS不知道这个主机
返回;
}
结果4=[NSMutableArray];
while(res){
开关(res->ai_系列){
案例6:
s6=(结构sockaddr_in6*)res->ai_addr;
如果(inet\u ntop(res->ai\u系列,(void*)和(s6->sin6\u地址)、buf、sizeof(buf))
==空)
{
NSLog(@“v6的inet_ntop失败!\n”);
}
其他的
{
//令人惊讶的是,每个地址都是双精度的,让我们添加这个测试
如果(![previousIP IsequalString:[NSString stringWithUTF8String:buf]]){
[结果添加对象:[NSString stringWithUTF8String:buf]];
}
}
打破
案例分析:
s4=(结构sockaddr_in*)res->ai_addr;
如果(inet_ntop(res->ai_系列,(void*)和(s4->sin_addr)、buf、sizeof(buf))
==空)
{
NSLog(@“inet_ntop对v4失败!\n”);
}
其他的
{
//令人惊讶的是,每个地址都是双精度的,让我们添加这个测试
如果(![previousIP IsequalString:[NSString stringWithUTF8String:buf]]){
[结果4添加对象:[NSString stringWithUTF8String:buf]];
}
}
打破
违约:
NSLog(@“既不是IPv4也不是IPv6!”);
}
//令人惊讶的是,每个地址都是双精度的,让我们添加这个测试
previousIP=[NSString stringWithUTF8String:buf];
res=res->ai_下一步;
}
}否则{
NSLog(@“未找到IP”);
返回;
}

谢谢你的代码;但是,这对我不起作用,因为我也不知道主机名。让我澄清一下我的问题:我打开iPhone中的设置应用程序(对等1),进入Wi-Fi并从非ios设备(对等2)连接到热点。现在建立了点对点连接。因此,为了让我(对等1)将读/写流绑定到主机(对等2),我需要知道主机的IP地址。所以问题是:如果没有人告诉我主机的主机名或IP地址,那么如何以编程方式提取该信息?请注意,我可以读取主机的SSID和BSSID。